diff --git a/ECU_front/main/main.c b/ECU_front/main/main.c index 9f34d59..418c1d8 100755 --- a/ECU_front/main/main.c +++ b/ECU_front/main/main.c @@ -11,7 +11,8 @@ * Version Modified By Date Comments * ------- ------------- ---------- ----------- * 5.0.0 Jefferson L. 15/01/2024 convertion to esp-idf - * + * 5.0.1 Luiz 24/09/2024 add timer task + * 5.0.1 Raynoan E. 25/09/2024 add infrared task */ #include @@ -21,6 +22,8 @@ #include "task/display.h" #include "task/rollover.h" #include "task/task_example.h" +#include "task/infrared.h" +#include "task/timer.h" #include "espnow_callback.h" @@ -28,6 +31,8 @@ static const char* TAG = "ECU_front"; static const gpio_num_t alive_pin = GPIO_NUM_12; +static const uint8_t mpu_calibrate = false; + /* LoRa preamble */ static const int cr = 8; // coding rate static const int sbw = 3; // signal bandwidth @@ -77,12 +82,31 @@ void app_main(void) { ); xTaskCreatePinnedToCore( - task_rollover, // task function - "rollover", // task name - 4096, // stack size - NULL, // parameters - 8, // priority - &th_rollover, // handler - APP_CPU_NUM // core number + task_rollover, // task function + "rollover", // task name + 4096, // stack size + (void*)mpu_calibrate, // parameters + 8, // priority + &th_rollover, // handler + APP_CPU_NUM // core number + ); + + xTaskCreatePinnedToCore( + task_timer, // task function + "timer", // task name + 2048, // stack size + NULL, // parameters + 8, // priority + &th_timer, // handler + APP_CPU_NUM // core number ); + + xTaskCreatePinnedToCore( + task_infrared, // task function + "infrared", // task name + 2048, // stack size + NULL, // parameters + 8, // priority + &th_infrared, // handler + APP_CPU_NUM); // core number } diff --git a/ECU_front/sdkconfig b/ECU_front/sdkconfig index 45761c0..06d887d 100644 --- a/ECU_front/sdkconfig +++ b/ECU_front/sdkconfig @@ -1,6 +1,6 @@ # # Automatically generated file. DO NOT EDIT. -# Espressif IoT Development Framework (ESP-IDF) 5.1.2 Project Configuration +# Espressif IoT Development Framework (ESP-IDF) 5.1.4 Project Configuration # CONFIG_SOC_BROWNOUT_RESET_SUPPORTED="Not determined" CONFIG_SOC_TWAI_BRP_DIV_SUPPORTED="Not determined" @@ -248,6 +248,14 @@ CONFIG_BOOTLOADER_LOG_LEVEL_INFO=y # CONFIG_BOOTLOADER_LOG_LEVEL_DEBUG is not set # CONFIG_BOOTLOADER_LOG_LEVEL_VERBOSE is not set CONFIG_BOOTLOADER_LOG_LEVEL=3 + +# +# Serial Flash Configurations +# +# CONFIG_BOOTLOADER_FLASH_DC_AWARE is not set +CONFIG_BOOTLOADER_FLASH_XMC_SUPPORT=y +# end of Serial Flash Configurations + # CONFIG_BOOTLOADER_VDDSDIO_BOOST_1_8V is not set CONFIG_BOOTLOADER_VDDSDIO_BOOST_1_9V=y # CONFIG_BOOTLOADER_FACTORY_RESET is not set @@ -262,7 +270,6 @@ CONFIG_BOOTLOADER_WDT_TIME_MS=9000 # CONFIG_BOOTLOADER_SKIP_VALIDATE_ALWAYS is not set CONFIG_BOOTLOADER_RESERVE_RTC_SIZE=0 # CONFIG_BOOTLOADER_CUSTOM_RESERVE_RTC is not set -CONFIG_BOOTLOADER_FLASH_XMC_SUPPORT=y # end of Bootloader config # @@ -668,7 +675,9 @@ CONFIG_ESP_SLEEP_FLASH_LEAKAGE_WORKAROUND=y CONFIG_ESP_SLEEP_RTC_BUS_ISO_WORKAROUND=y # CONFIG_ESP_SLEEP_GPIO_RESET_WORKAROUND is not set CONFIG_ESP_SLEEP_WAIT_FLASH_READY_EXTRA_DELAY=2000 +# CONFIG_ESP_SLEEP_DEBUG is not set CONFIG_ESP_SLEEP_GPIO_ENABLE_INTERNAL_RESISTORS=y +# CONFIG_ESP_SLEEP_CACHE_SAFE_ASSERTION is not set # end of Sleep Config # @@ -742,6 +751,7 @@ CONFIG_ESP_PHY_RF_CAL_PARTIAL=y # CONFIG_ESP_PHY_RF_CAL_NONE is not set # CONFIG_ESP_PHY_RF_CAL_FULL is not set CONFIG_ESP_PHY_CALIBRATION_MODE=0 +# CONFIG_ESP_PHY_PLL_TRACK_DEBUG is not set # end of PHY # @@ -932,6 +942,7 @@ CONFIG_ESP_WIFI_MBEDTLS_TLS_CLIENT=y # CONFIG_ESP_WIFI_DEBUG_PRINT is not set # CONFIG_ESP_WIFI_TESTING_OPTIONS is not set CONFIG_ESP_WIFI_ENTERPRISE_SUPPORT=y +# CONFIG_ESP_WIFI_ENT_FREE_DYNAMIC_BUFFER is not set # end of Wi-Fi # @@ -1025,7 +1036,7 @@ CONFIG_FREERTOS_CORETIMER_0=y # CONFIG_FREERTOS_CORETIMER_1 is not set CONFIG_FREERTOS_SYSTICK_USES_CCOUNT=y # CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH is not set -# CONFIG_FREERTOS_PLACE_SNAPSHOT_FUNS_INTO_FLASH is not set +CONFIG_FREERTOS_PLACE_SNAPSHOT_FUNS_INTO_FLASH=y # CONFIG_FREERTOS_CHECK_PORT_CRITICAL_COMPLIANCE is not set CONFIG_FREERTOS_ENABLE_TASK_SNAPSHOT=y # end of Port @@ -1213,6 +1224,13 @@ CONFIG_LWIP_SNTP_MAX_SERVERS=1 CONFIG_LWIP_SNTP_UPDATE_DELAY=3600000 # end of SNTP +# +# DNS +# +CONFIG_LWIP_DNS_MAX_SERVERS=3 +# CONFIG_LWIP_FALLBACK_DNS_SERVER_SUPPORT is not set +# end of DNS + CONFIG_LWIP_BRIDGEIF_MAX_PORTS=7 CONFIG_LWIP_ESP_LWIP_ASSERT=y @@ -1279,6 +1297,7 @@ CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_MAX_CERTS=200 # CONFIG_MBEDTLS_ECP_RESTARTABLE is not set CONFIG_MBEDTLS_CMAC_C=y CONFIG_MBEDTLS_HARDWARE_AES=y +CONFIG_MBEDTLS_GCM_SUPPORT_NON_AES_CIPHER=y CONFIG_MBEDTLS_HARDWARE_MPI=y CONFIG_MBEDTLS_HARDWARE_SHA=y CONFIG_MBEDTLS_ROM_MD5=y @@ -1424,6 +1443,7 @@ CONFIG_OPENTHREAD_NETWORK_PSKC="104810e2315100afd6bc9215a6bfac53" CONFIG_OPENTHREAD_XTAL_ACCURACY=130 # CONFIG_OPENTHREAD_SPINEL_ONLY is not set +CONFIG_OPENTHREAD_RX_ON_WHEN_IDLE=y # # Thread Address Query Config @@ -1460,6 +1480,27 @@ CONFIG_MMU_PAGE_MODE="64KB" CONFIG_MMU_PAGE_SIZE=0x10000 # end of MMU Config +# +# Main Flash configuration +# + +# +# SPI Flash behavior when brownout +# +CONFIG_SPI_FLASH_BROWNOUT_RESET_XMC=y +CONFIG_SPI_FLASH_BROWNOUT_RESET=y +# end of SPI Flash behavior when brownout + +# +# Optional and Experimental Features (READ DOCS FIRST) +# + +# +# Features here require specific hardware (READ DOCS FIRST!) +# +# end of Optional and Experimental Features (READ DOCS FIRST) +# end of Main Flash configuration + # # SPI Flash driver # @@ -1479,13 +1520,6 @@ CONFIG_SPI_FLASH_WRITE_CHUNK_SIZE=8192 # CONFIG_SPI_FLASH_CHECK_ERASE_TIMEOUT_DISABLED is not set # CONFIG_SPI_FLASH_OVERRIDE_CHIP_DRIVER_LIST is not set -# -# SPI Flash behavior when brownout -# -CONFIG_SPI_FLASH_BROWNOUT_RESET_XMC=y -CONFIG_SPI_FLASH_BROWNOUT_RESET=y -# end of SPI Flash behavior when brownout - # # Auto-detect flash chips # @@ -1572,11 +1606,6 @@ CONFIG_UNITY_ENABLE_IDF_TEST_RUNNER=y # CONFIG_UNITY_ENABLE_BACKTRACE_ON_FAIL is not set # end of Unity unit testing library -# -# Root Hub configuration -# -# end of Root Hub configuration - # # Virtual file system # diff --git a/ECU_rear/main/main.c b/ECU_rear/main/main.c index 2481a6b..3e0ba05 100755 --- a/ECU_rear/main/main.c +++ b/ECU_rear/main/main.c @@ -16,14 +16,18 @@ #include #include "system.h" +#include "task/rpm.h" #include "task/alive.h" #include "task/battery.h" +#include "task/speedometer.h" // #include "task/fuel_em.h" #include "espnow_callback.h" static const char *TAG = "ECU_rear"; +static const gpio_num_t rpm_pin = GPIO_NUM_36; +static const gpio_num_t speed_pin = GPIO_NUM_39; static const gpio_num_t alive_pin = GPIO_NUM_2; // static const gpio_num_t fuel_em_pin = GPIO_NUM_34; static const battery_config_t battery_config = { @@ -71,4 +75,24 @@ void app_main(void) { // &th_fuel_em, // handler // APP_CPU_NUM // core number // ); + + xTaskCreatePinnedToCore( + task_speed, // task function + "speed", // task name + 4096, // stack size + (void*)speed_pin, // parameters + 10, // priority + &th_speed, // handler + APP_CPU_NUM // core number + ); + + xTaskCreatePinnedToCore( + task_rpm, // task function + "RPM", // task name + 4096, // stack size + (void*)rpm_pin, // parameters + 10, // priority + &th_rpm, // handler + APP_CPU_NUM // core number + ); } diff --git a/ECU_rear/sdkconfig b/ECU_rear/sdkconfig index 45761c0..5c04c82 100644 --- a/ECU_rear/sdkconfig +++ b/ECU_rear/sdkconfig @@ -1,6 +1,6 @@ # # Automatically generated file. DO NOT EDIT. -# Espressif IoT Development Framework (ESP-IDF) 5.1.2 Project Configuration +# Espressif IoT Development Framework (ESP-IDF) 5.1.4 Project Configuration # CONFIG_SOC_BROWNOUT_RESET_SUPPORTED="Not determined" CONFIG_SOC_TWAI_BRP_DIV_SUPPORTED="Not determined" @@ -248,6 +248,14 @@ CONFIG_BOOTLOADER_LOG_LEVEL_INFO=y # CONFIG_BOOTLOADER_LOG_LEVEL_DEBUG is not set # CONFIG_BOOTLOADER_LOG_LEVEL_VERBOSE is not set CONFIG_BOOTLOADER_LOG_LEVEL=3 + +# +# Serial Flash Configurations +# +# CONFIG_BOOTLOADER_FLASH_DC_AWARE is not set +CONFIG_BOOTLOADER_FLASH_XMC_SUPPORT=y +# end of Serial Flash Configurations + # CONFIG_BOOTLOADER_VDDSDIO_BOOST_1_8V is not set CONFIG_BOOTLOADER_VDDSDIO_BOOST_1_9V=y # CONFIG_BOOTLOADER_FACTORY_RESET is not set @@ -262,7 +270,6 @@ CONFIG_BOOTLOADER_WDT_TIME_MS=9000 # CONFIG_BOOTLOADER_SKIP_VALIDATE_ALWAYS is not set CONFIG_BOOTLOADER_RESERVE_RTC_SIZE=0 # CONFIG_BOOTLOADER_CUSTOM_RESERVE_RTC is not set -CONFIG_BOOTLOADER_FLASH_XMC_SUPPORT=y # end of Bootloader config # @@ -668,7 +675,9 @@ CONFIG_ESP_SLEEP_FLASH_LEAKAGE_WORKAROUND=y CONFIG_ESP_SLEEP_RTC_BUS_ISO_WORKAROUND=y # CONFIG_ESP_SLEEP_GPIO_RESET_WORKAROUND is not set CONFIG_ESP_SLEEP_WAIT_FLASH_READY_EXTRA_DELAY=2000 +# CONFIG_ESP_SLEEP_DEBUG is not set CONFIG_ESP_SLEEP_GPIO_ENABLE_INTERNAL_RESISTORS=y +# CONFIG_ESP_SLEEP_CACHE_SAFE_ASSERTION is not set # end of Sleep Config # @@ -742,6 +751,7 @@ CONFIG_ESP_PHY_RF_CAL_PARTIAL=y # CONFIG_ESP_PHY_RF_CAL_NONE is not set # CONFIG_ESP_PHY_RF_CAL_FULL is not set CONFIG_ESP_PHY_CALIBRATION_MODE=0 +# CONFIG_ESP_PHY_PLL_TRACK_DEBUG is not set # end of PHY # @@ -932,6 +942,7 @@ CONFIG_ESP_WIFI_MBEDTLS_TLS_CLIENT=y # CONFIG_ESP_WIFI_DEBUG_PRINT is not set # CONFIG_ESP_WIFI_TESTING_OPTIONS is not set CONFIG_ESP_WIFI_ENTERPRISE_SUPPORT=y +# CONFIG_ESP_WIFI_ENT_FREE_DYNAMIC_BUFFER is not set # end of Wi-Fi # @@ -1025,7 +1036,7 @@ CONFIG_FREERTOS_CORETIMER_0=y # CONFIG_FREERTOS_CORETIMER_1 is not set CONFIG_FREERTOS_SYSTICK_USES_CCOUNT=y # CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH is not set -# CONFIG_FREERTOS_PLACE_SNAPSHOT_FUNS_INTO_FLASH is not set +CONFIG_FREERTOS_PLACE_SNAPSHOT_FUNS_INTO_FLASH=y # CONFIG_FREERTOS_CHECK_PORT_CRITICAL_COMPLIANCE is not set CONFIG_FREERTOS_ENABLE_TASK_SNAPSHOT=y # end of Port @@ -1213,6 +1224,13 @@ CONFIG_LWIP_SNTP_MAX_SERVERS=1 CONFIG_LWIP_SNTP_UPDATE_DELAY=3600000 # end of SNTP +# +# DNS +# +CONFIG_LWIP_DNS_MAX_SERVERS=3 +# CONFIG_LWIP_FALLBACK_DNS_SERVER_SUPPORT is not set +# end of DNS + CONFIG_LWIP_BRIDGEIF_MAX_PORTS=7 CONFIG_LWIP_ESP_LWIP_ASSERT=y @@ -1279,6 +1297,7 @@ CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_MAX_CERTS=200 # CONFIG_MBEDTLS_ECP_RESTARTABLE is not set CONFIG_MBEDTLS_CMAC_C=y CONFIG_MBEDTLS_HARDWARE_AES=y +# CONFIG_MBEDTLS_GCM_SUPPORT_NON_AES_CIPHER is not set CONFIG_MBEDTLS_HARDWARE_MPI=y CONFIG_MBEDTLS_HARDWARE_SHA=y CONFIG_MBEDTLS_ROM_MD5=y @@ -1424,6 +1443,7 @@ CONFIG_OPENTHREAD_NETWORK_PSKC="104810e2315100afd6bc9215a6bfac53" CONFIG_OPENTHREAD_XTAL_ACCURACY=130 # CONFIG_OPENTHREAD_SPINEL_ONLY is not set +CONFIG_OPENTHREAD_RX_ON_WHEN_IDLE=y # # Thread Address Query Config @@ -1460,6 +1480,27 @@ CONFIG_MMU_PAGE_MODE="64KB" CONFIG_MMU_PAGE_SIZE=0x10000 # end of MMU Config +# +# Main Flash configuration +# + +# +# SPI Flash behavior when brownout +# +CONFIG_SPI_FLASH_BROWNOUT_RESET_XMC=y +CONFIG_SPI_FLASH_BROWNOUT_RESET=y +# end of SPI Flash behavior when brownout + +# +# Optional and Experimental Features (READ DOCS FIRST) +# + +# +# Features here require specific hardware (READ DOCS FIRST!) +# +# end of Optional and Experimental Features (READ DOCS FIRST) +# end of Main Flash configuration + # # SPI Flash driver # @@ -1479,13 +1520,6 @@ CONFIG_SPI_FLASH_WRITE_CHUNK_SIZE=8192 # CONFIG_SPI_FLASH_CHECK_ERASE_TIMEOUT_DISABLED is not set # CONFIG_SPI_FLASH_OVERRIDE_CHIP_DRIVER_LIST is not set -# -# SPI Flash behavior when brownout -# -CONFIG_SPI_FLASH_BROWNOUT_RESET_XMC=y -CONFIG_SPI_FLASH_BROWNOUT_RESET=y -# end of SPI Flash behavior when brownout - # # Auto-detect flash chips # @@ -1572,11 +1606,6 @@ CONFIG_UNITY_ENABLE_IDF_TEST_RUNNER=y # CONFIG_UNITY_ENABLE_BACKTRACE_ON_FAIL is not set # end of Unity unit testing library -# -# Root Hub configuration -# -# end of Root Hub configuration - # # Virtual file system # diff --git a/TCU/sdkconfig b/TCU/sdkconfig index 45761c0..5b2ecbf 100644 --- a/TCU/sdkconfig +++ b/TCU/sdkconfig @@ -1,6 +1,6 @@ # # Automatically generated file. DO NOT EDIT. -# Espressif IoT Development Framework (ESP-IDF) 5.1.2 Project Configuration +# Espressif IoT Development Framework (ESP-IDF) 5.2.2 Project Configuration # CONFIG_SOC_BROWNOUT_RESET_SUPPORTED="Not determined" CONFIG_SOC_TWAI_BRP_DIV_SUPPORTED="Not determined" @@ -17,6 +17,7 @@ CONFIG_SOC_PCNT_SUPPORTED=y CONFIG_SOC_WIFI_SUPPORTED=y CONFIG_SOC_SDIO_SLAVE_SUPPORTED=y CONFIG_SOC_TWAI_SUPPORTED=y +CONFIG_SOC_EFUSE_SUPPORTED=y CONFIG_SOC_EMAC_SUPPORTED=y CONFIG_SOC_ULP_SUPPORTED=y CONFIG_SOC_CCOMP_TIMER_SUPPORTED=y @@ -38,6 +39,10 @@ CONFIG_SOC_SECURE_BOOT_SUPPORTED=y CONFIG_SOC_TOUCH_SENSOR_SUPPORTED=y CONFIG_SOC_BOD_SUPPORTED=y CONFIG_SOC_ULP_FSM_SUPPORTED=y +CONFIG_SOC_CLK_TREE_SUPPORTED=y +CONFIG_SOC_MPU_SUPPORTED=y +CONFIG_SOC_WDT_SUPPORTED=y +CONFIG_SOC_SPI_FLASH_SUPPORTED=y CONFIG_SOC_DPORT_WORKAROUND_DIS_INTERRUPT_LVL=5 CONFIG_SOC_XTAL_SUPPORT_26M=y CONFIG_SOC_XTAL_SUPPORT_40M=y @@ -54,15 +59,18 @@ CONFIG_SOC_ADC_DIGI_MIN_BITWIDTH=9 CONFIG_SOC_ADC_DIGI_MAX_BITWIDTH=12 CONFIG_SOC_ADC_DIGI_RESULT_BYTES=2 CONFIG_SOC_ADC_DIGI_DATA_BYTES_PER_CONV=4 +CONFIG_SOC_ADC_DIGI_MONITOR_NUM=0 CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_HIGH=2 CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_LOW=20 CONFIG_SOC_ADC_RTC_MIN_BITWIDTH=9 CONFIG_SOC_ADC_RTC_MAX_BITWIDTH=12 +CONFIG_SOC_ADC_SHARED_POWER=y CONFIG_SOC_SHARED_IDCACHE_SUPPORTED=y CONFIG_SOC_IDCACHE_PER_CORE=y CONFIG_SOC_CPU_CORES_NUM=2 CONFIG_SOC_CPU_INTR_NUM=32 CONFIG_SOC_CPU_HAS_FPU=y +CONFIG_SOC_HP_CPU_HAS_MULTIPLE_CORES=y CONFIG_SOC_CPU_BREAKPOINTS_NUM=2 CONFIG_SOC_CPU_WATCHPOINTS_NUM=2 CONFIG_SOC_CPU_WATCHPOINT_MAX_REGION_SIZE=64 @@ -72,12 +80,16 @@ CONFIG_SOC_DAC_DMA_16BIT_ALIGN=y CONFIG_SOC_GPIO_PORT=1 CONFIG_SOC_GPIO_PIN_COUNT=40 CONFIG_SOC_GPIO_VALID_GPIO_MASK=0xFFFFFFFFFF +CONFIG_SOC_GPIO_IN_RANGE_MAX=39 +CONFIG_SOC_GPIO_OUT_RANGE_MAX=33 CONFIG_SOC_GPIO_VALID_DIGITAL_IO_PAD_MASK=0xEF0FEA +CONFIG_SOC_GPIO_CLOCKOUT_BY_IO_MUX=y CONFIG_SOC_I2C_NUM=2 CONFIG_SOC_I2C_FIFO_LEN=32 CONFIG_SOC_I2C_CMD_REG_NUM=16 CONFIG_SOC_I2C_SUPPORT_SLAVE=y CONFIG_SOC_I2C_SUPPORT_APB=y +CONFIG_SOC_I2C_STOP_INDEPENDENT=y CONFIG_SOC_I2S_NUM=2 CONFIG_SOC_I2S_HW_VERSION_1=y CONFIG_SOC_I2S_SUPPORTS_APLL=y @@ -160,6 +172,7 @@ CONFIG_SOC_TWAI_BRP_MIN=2 CONFIG_SOC_TWAI_CLK_SUPPORT_APB=y CONFIG_SOC_TWAI_SUPPORT_MULTI_ADDRESS_LAYOUT=y CONFIG_SOC_UART_NUM=3 +CONFIG_SOC_UART_HP_NUM=3 CONFIG_SOC_UART_SUPPORT_APB_CLK=y CONFIG_SOC_UART_SUPPORT_REF_TICK=y CONFIG_SOC_UART_FIFO_LEN=128 @@ -167,10 +180,13 @@ CONFIG_SOC_UART_BITRATE_MAX=5000000 CONFIG_SOC_SPIRAM_SUPPORTED=y CONFIG_SOC_SPI_MEM_SUPPORT_CONFIG_GPIO_BY_EFUSE=y CONFIG_SOC_SHA_SUPPORT_PARALLEL_ENG=y +CONFIG_SOC_SHA_ENDIANNESS_BE=y CONFIG_SOC_SHA_SUPPORT_SHA1=y CONFIG_SOC_SHA_SUPPORT_SHA256=y CONFIG_SOC_SHA_SUPPORT_SHA384=y CONFIG_SOC_SHA_SUPPORT_SHA512=y +CONFIG_SOC_MPI_MEM_BLOCKS_NUM=4 +CONFIG_SOC_MPI_OPERATIONS_NUM=y CONFIG_SOC_RSA_MAX_BIT_LEN=4096 CONFIG_SOC_AES_SUPPORT_AES_128=y CONFIG_SOC_AES_SUPPORT_AES_192=y @@ -191,10 +207,6 @@ CONFIG_SOC_PM_SUPPORT_VDDSDIO_PD=y CONFIG_SOC_PM_SUPPORT_MODEM_PD=y CONFIG_SOC_CONFIGURABLE_VDDSDIO_SUPPORTED=y CONFIG_SOC_CLK_APLL_SUPPORTED=y -CONFIG_SOC_APLL_MULTIPLIER_OUT_MIN_HZ=350000000 -CONFIG_SOC_APLL_MULTIPLIER_OUT_MAX_HZ=500000000 -CONFIG_SOC_APLL_MIN_HZ=5303031 -CONFIG_SOC_APLL_MAX_HZ=125000000 CONFIG_SOC_CLK_RC_FAST_D256_SUPPORTED=y CONFIG_SOC_RTC_SLOW_CLK_SUPPORT_RC_FAST_D256=y CONFIG_SOC_CLK_RC_FAST_SUPPORT_CALIBRATION=y @@ -213,9 +225,11 @@ CONFIG_SOC_BLUFI_SUPPORTED=y CONFIG_SOC_ULP_HAS_ADC=y CONFIG_SOC_PHY_COMBO_MODULE=y CONFIG_IDF_CMAKE=y +CONFIG_IDF_TOOLCHAIN="gcc" CONFIG_IDF_TARGET_ARCH_XTENSA=y CONFIG_IDF_TARGET_ARCH="xtensa" CONFIG_IDF_TARGET="esp32" +CONFIG_IDF_INIT_VERSION="5.2.2" CONFIG_IDF_TARGET_ESP32=y CONFIG_IDF_FIRMWARE_CHIP_ID=0x0000 @@ -236,6 +250,14 @@ CONFIG_APP_BUILD_USE_FLASH_SECTIONS=y # # Bootloader config # + +# +# Bootloader manager +# +CONFIG_BOOTLOADER_COMPILE_TIME_DATE=y +CONFIG_BOOTLOADER_PROJECT_VER=1 +# end of Bootloader manager + CONFIG_BOOTLOADER_OFFSET_IN_FLASH=0x1000 CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_SIZE=y # CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_DEBUG is not set @@ -248,6 +270,14 @@ CONFIG_BOOTLOADER_LOG_LEVEL_INFO=y # CONFIG_BOOTLOADER_LOG_LEVEL_DEBUG is not set # CONFIG_BOOTLOADER_LOG_LEVEL_VERBOSE is not set CONFIG_BOOTLOADER_LOG_LEVEL=3 + +# +# Serial Flash Configurations +# +# CONFIG_BOOTLOADER_FLASH_DC_AWARE is not set +CONFIG_BOOTLOADER_FLASH_XMC_SUPPORT=y +# end of Serial Flash Configurations + # CONFIG_BOOTLOADER_VDDSDIO_BOOST_1_8V is not set CONFIG_BOOTLOADER_VDDSDIO_BOOST_1_9V=y # CONFIG_BOOTLOADER_FACTORY_RESET is not set @@ -262,7 +292,6 @@ CONFIG_BOOTLOADER_WDT_TIME_MS=9000 # CONFIG_BOOTLOADER_SKIP_VALIDATE_ALWAYS is not set CONFIG_BOOTLOADER_RESERVE_RTC_SIZE=0 # CONFIG_BOOTLOADER_CUSTOM_RESERVE_RTC is not set -CONFIG_BOOTLOADER_FLASH_XMC_SUPPORT=y # end of Bootloader config # @@ -291,6 +320,8 @@ CONFIG_ESP_ROM_HAS_JPEG_DECODE=y CONFIG_ESP_ROM_HAS_UART_BUF_SWITCH=y CONFIG_ESP_ROM_NEEDS_SWSETUP_WORKAROUND=y CONFIG_ESP_ROM_HAS_NEWLIB_NANO_FORMAT=y +CONFIG_ESP_ROM_HAS_SW_FLOAT=y +CONFIG_ESP_ROM_USB_SERIAL_DEVICE_NUM=-1 # # Serial flasher config @@ -342,7 +373,7 @@ CONFIG_PARTITION_TABLE_MD5=y # # Compiler options # -CONFIG_COMPILER_OPTIMIZATION_DEFAULT=y +CONFIG_COMPILER_OPTIMIZATION_DEBUG=y # CONFIG_COMPILER_OPTIMIZATION_SIZE is not set # CONFIG_COMPILER_OPTIMIZATION_PERF is not set # CONFIG_COMPILER_OPTIMIZATION_NONE is not set @@ -361,7 +392,10 @@ CONFIG_COMPILER_STACK_CHECK_MODE_NONE=y # CONFIG_COMPILER_STACK_CHECK_MODE_ALL is not set # CONFIG_COMPILER_WARN_WRITE_STRINGS is not set # CONFIG_COMPILER_DISABLE_GCC12_WARNINGS is not set +# CONFIG_COMPILER_DISABLE_GCC13_WARNINGS is not set # CONFIG_COMPILER_DUMP_RTL_FILES is not set +CONFIG_COMPILER_RT_LIB_GCCLIB=y +CONFIG_COMPILER_RT_LIB_NAME="gcc" # end of Compiler options # @@ -384,6 +418,7 @@ CONFIG_APPTRACE_LOCK_ENABLE=y # Bluetooth # # CONFIG_BT_ENABLED is not set +CONFIG_BT_ALARM_MAX_NUM=50 # end of Bluetooth # @@ -501,6 +536,19 @@ CONFIG_GPTIMER_ISR_HANDLER_IN_IRAM=y # CONFIG_DAC_ENABLE_DEBUG_LOG is not set CONFIG_DAC_DMA_AUTO_16BIT_ALIGN=y # end of DAC Configuration + +# +# LEDC Configuration +# +# CONFIG_LEDC_CTRL_FUNC_IN_IRAM is not set +# end of LEDC Configuration + +# +# I2C Configuration +# +# CONFIG_I2C_ISR_IRAM_SAFE is not set +# CONFIG_I2C_ENABLE_DEBUG_LOG is not set +# end of I2C Configuration # end of Driver Configurations # @@ -585,6 +633,10 @@ CONFIG_ESP_EVENT_POST_FROM_IRAM_ISR=y # # GDB Stub # +CONFIG_ESP_GDBSTUB_ENABLED=y +# CONFIG_ESP_SYSTEM_GDBSTUB_RUNTIME is not set +CONFIG_ESP_GDBSTUB_SUPPORT_TASKS=y +CONFIG_ESP_GDBSTUB_MAX_TASKS=32 # end of GDB Stub # @@ -668,6 +720,8 @@ CONFIG_ESP_SLEEP_FLASH_LEAKAGE_WORKAROUND=y CONFIG_ESP_SLEEP_RTC_BUS_ISO_WORKAROUND=y # CONFIG_ESP_SLEEP_GPIO_RESET_WORKAROUND is not set CONFIG_ESP_SLEEP_WAIT_FLASH_READY_EXTRA_DELAY=2000 +# CONFIG_ESP_SLEEP_CACHE_SAFE_ASSERTION is not set +# CONFIG_ESP_SLEEP_DEBUG is not set CONFIG_ESP_SLEEP_GPIO_ENABLE_INTERNAL_RESISTORS=y # end of Sleep Config @@ -742,6 +796,7 @@ CONFIG_ESP_PHY_RF_CAL_PARTIAL=y # CONFIG_ESP_PHY_RF_CAL_NONE is not set # CONFIG_ESP_PHY_RF_CAL_FULL is not set CONFIG_ESP_PHY_CALIBRATION_MODE=0 +# CONFIG_ESP_PHY_PLL_TRACK_DEBUG is not set # end of PHY # @@ -793,7 +848,6 @@ CONFIG_ESP32_TRACEMEM_RESERVE_DRAM=0x0 CONFIG_ESP_SYSTEM_PANIC_PRINT_REBOOT=y # CONFIG_ESP_SYSTEM_PANIC_SILENT_REBOOT is not set # CONFIG_ESP_SYSTEM_PANIC_GDBSTUB is not set -# CONFIG_ESP_SYSTEM_GDBSTUB_RUNTIME is not set CONFIG_ESP_SYSTEM_PANIC_REBOOT_DELAY_SECONDS=0 # @@ -813,7 +867,6 @@ CONFIG_ESP_CONSOLE_UART_DEFAULT=y # CONFIG_ESP_CONSOLE_UART_CUSTOM is not set # CONFIG_ESP_CONSOLE_NONE is not set CONFIG_ESP_CONSOLE_UART=y -CONFIG_ESP_CONSOLE_MULTIPLE_UART=y CONFIG_ESP_CONSOLE_UART_NUM=0 CONFIG_ESP_CONSOLE_UART_BAUDRATE=115200 CONFIG_ESP_INT_WDT=y @@ -932,6 +985,7 @@ CONFIG_ESP_WIFI_MBEDTLS_TLS_CLIENT=y # CONFIG_ESP_WIFI_DEBUG_PRINT is not set # CONFIG_ESP_WIFI_TESTING_OPTIONS is not set CONFIG_ESP_WIFI_ENTERPRISE_SUPPORT=y +# CONFIG_ESP_WIFI_ENT_FREE_DYNAMIC_BUFFER is not set # end of Wi-Fi # @@ -979,6 +1033,7 @@ CONFIG_FATFS_TIMEOUT_MS=10000 CONFIG_FATFS_PER_FILE_CACHE=y # CONFIG_FATFS_USE_FASTSEEK is not set CONFIG_FATFS_VFS_FSTAT_BLKSIZE=0 +# CONFIG_FATFS_IMMEDIATE_FSYNC is not set # end of FAT Filesystem support # @@ -1000,6 +1055,7 @@ CONFIG_FREERTOS_IDLE_TASK_STACKSIZE=1536 # CONFIG_FREERTOS_USE_TICK_HOOK is not set CONFIG_FREERTOS_MAX_TASK_NAME_LEN=16 # CONFIG_FREERTOS_ENABLE_BACKWARD_COMPATIBILITY is not set +CONFIG_FREERTOS_TIMER_SERVICE_TASK_NAME="Tmr Svc" CONFIG_FREERTOS_TIMER_TASK_PRIORITY=1 CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH=2048 CONFIG_FREERTOS_TIMER_QUEUE_LENGTH=10 @@ -1007,6 +1063,7 @@ CONFIG_FREERTOS_QUEUE_REGISTRY_SIZE=0 CONFIG_FREERTOS_TASK_NOTIFICATION_ARRAY_ENTRIES=1 # CONFIG_FREERTOS_USE_TRACE_FACILITY is not set # CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS is not set +# CONFIG_FREERTOS_USE_APPLICATION_TASK_TAG is not set # end of Kernel # @@ -1015,6 +1072,7 @@ CONFIG_FREERTOS_TASK_NOTIFICATION_ARRAY_ENTRIES=1 CONFIG_FREERTOS_TASK_FUNCTION_WRAPPER=y # CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK is not set CONFIG_FREERTOS_TLSP_DELETION_CALLBACKS=y +# CONFIG_FREERTOS_TASK_PRE_DELETION_HOOK is not set # CONFIG_FREERTOS_ENABLE_STATIC_TASK_CLEAN_UP is not set CONFIG_FREERTOS_CHECK_MUTEX_GIVEN_BY_OWNER=y CONFIG_FREERTOS_ISR_STACKSIZE=1536 @@ -1025,14 +1083,15 @@ CONFIG_FREERTOS_CORETIMER_0=y # CONFIG_FREERTOS_CORETIMER_1 is not set CONFIG_FREERTOS_SYSTICK_USES_CCOUNT=y # CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH is not set -# CONFIG_FREERTOS_PLACE_SNAPSHOT_FUNS_INTO_FLASH is not set # CONFIG_FREERTOS_CHECK_PORT_CRITICAL_COMPLIANCE is not set -CONFIG_FREERTOS_ENABLE_TASK_SNAPSHOT=y # end of Port +CONFIG_FREERTOS_PORT=y CONFIG_FREERTOS_NO_AFFINITY=0x7FFFFFFF CONFIG_FREERTOS_SUPPORT_STATIC_ALLOCATION=y CONFIG_FREERTOS_DEBUG_OCDAWARE=y +CONFIG_FREERTOS_ENABLE_TASK_SNAPSHOT=y +CONFIG_FREERTOS_PLACE_SNAPSHOT_FUNS_INTO_FLASH=y # end of FreeRTOS # @@ -1057,6 +1116,7 @@ CONFIG_HEAP_TRACING_OFF=y # CONFIG_HEAP_TRACING_STANDALONE is not set # CONFIG_HEAP_TRACING_TOHOST is not set # CONFIG_HEAP_USE_HOOKS is not set +# CONFIG_HEAP_TASK_TRACKING is not set # CONFIG_HEAP_ABORT_WHEN_ALLOCATION_FAILS is not set # CONFIG_HEAP_PLACE_FUNCTION_INTO_FLASH is not set # end of Heap memory debugging @@ -1075,6 +1135,7 @@ CONFIG_LOG_MAXIMUM_EQUALS_DEFAULT=y # CONFIG_LOG_MAXIMUM_LEVEL_DEBUG is not set # CONFIG_LOG_MAXIMUM_LEVEL_VERBOSE is not set CONFIG_LOG_MAXIMUM_LEVEL=3 +# CONFIG_LOG_MASTER_LEVEL is not set CONFIG_LOG_COLORS=y CONFIG_LOG_TIMESTAMP_SOURCE_RTOS=y # CONFIG_LOG_TIMESTAMP_SOURCE_SYSTEM is not set @@ -1083,6 +1144,7 @@ CONFIG_LOG_TIMESTAMP_SOURCE_RTOS=y # # LWIP # +CONFIG_LWIP_ENABLE=y CONFIG_LWIP_LOCAL_HOSTNAME="espressif" # CONFIG_LWIP_NETIF_API is not set CONFIG_LWIP_TCPIP_TASK_PRIO=18 @@ -1129,6 +1191,7 @@ CONFIG_LWIP_DHCP_COARSE_TIMER_SECS=1 CONFIG_LWIP_DHCPS=y CONFIG_LWIP_DHCPS_LEASE_UNIT=60 CONFIG_LWIP_DHCPS_MAX_STATION_NUM=8 +CONFIG_LWIP_DHCPS_STATIC_ENTRIES=y # end of DHCP server # CONFIG_LWIP_AUTOIP is not set @@ -1213,6 +1276,13 @@ CONFIG_LWIP_SNTP_MAX_SERVERS=1 CONFIG_LWIP_SNTP_UPDATE_DELAY=3600000 # end of SNTP +# +# DNS +# +CONFIG_LWIP_DNS_MAX_SERVERS=3 +# CONFIG_LWIP_FALLBACK_DNS_SERVER_SUPPORT is not set +# end of DNS + CONFIG_LWIP_BRIDGEIF_MAX_PORTS=7 CONFIG_LWIP_ESP_LWIP_ASSERT=y @@ -1279,7 +1349,9 @@ CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_MAX_CERTS=200 # CONFIG_MBEDTLS_ECP_RESTARTABLE is not set CONFIG_MBEDTLS_CMAC_C=y CONFIG_MBEDTLS_HARDWARE_AES=y +# CONFIG_MBEDTLS_GCM_SUPPORT_NON_AES_CIPHER is not set CONFIG_MBEDTLS_HARDWARE_MPI=y +# CONFIG_MBEDTLS_LARGE_KEY_SOFTWARE_MPI is not set CONFIG_MBEDTLS_HARDWARE_SHA=y CONFIG_MBEDTLS_ROM_MD5=y # CONFIG_MBEDTLS_ATCA_HW_ECDSA_SIGN is not set @@ -1364,7 +1436,7 @@ CONFIG_MBEDTLS_ECP_FIXED_POINT_OPTIM=y # CONFIG_MBEDTLS_CHACHA20_C is not set # CONFIG_MBEDTLS_HKDF_C is not set # CONFIG_MBEDTLS_THREADING_C is not set -# CONFIG_MBEDTLS_LARGE_KEY_SOFTWARE_MPI is not set +CONFIG_MBEDTLS_ERROR_STRINGS=y # end of mbedTLS # @@ -1403,6 +1475,7 @@ CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC_HRT=y # NVS # # CONFIG_NVS_ASSERT_ERROR_CHECK is not set +# CONFIG_NVS_LEGACY_DUP_KEYS_COMPATIBILITY is not set # end of NVS # @@ -1424,6 +1497,7 @@ CONFIG_OPENTHREAD_NETWORK_PSKC="104810e2315100afd6bc9215a6bfac53" CONFIG_OPENTHREAD_XTAL_ACCURACY=130 # CONFIG_OPENTHREAD_SPINEL_ONLY is not set +CONFIG_OPENTHREAD_RX_ON_WHEN_IDLE=y # # Thread Address Query Config @@ -1460,6 +1534,27 @@ CONFIG_MMU_PAGE_MODE="64KB" CONFIG_MMU_PAGE_SIZE=0x10000 # end of MMU Config +# +# Main Flash configuration +# + +# +# SPI Flash behavior when brownout +# +CONFIG_SPI_FLASH_BROWNOUT_RESET_XMC=y +CONFIG_SPI_FLASH_BROWNOUT_RESET=y +# end of SPI Flash behavior when brownout + +# +# Optional and Experimental Features (READ DOCS FIRST) +# + +# +# Features here require specific hardware (READ DOCS FIRST!) +# +# end of Optional and Experimental Features (READ DOCS FIRST) +# end of Main Flash configuration + # # SPI Flash driver # @@ -1479,13 +1574,6 @@ CONFIG_SPI_FLASH_WRITE_CHUNK_SIZE=8192 # CONFIG_SPI_FLASH_CHECK_ERASE_TIMEOUT_DISABLED is not set # CONFIG_SPI_FLASH_OVERRIDE_CHIP_DRIVER_LIST is not set -# -# SPI Flash behavior when brownout -# -CONFIG_SPI_FLASH_BROWNOUT_RESET_XMC=y -CONFIG_SPI_FLASH_BROWNOUT_RESET=y -# end of SPI Flash behavior when brownout - # # Auto-detect flash chips # @@ -1572,11 +1660,6 @@ CONFIG_UNITY_ENABLE_IDF_TEST_RUNNER=y # CONFIG_UNITY_ENABLE_BACKTRACE_ON_FAIL is not set # end of Unity unit testing library -# -# Root Hub configuration -# -# end of Root Hub configuration - # # Virtual file system # @@ -1649,6 +1732,7 @@ CONFIG_FLASHMODE_DIO=y CONFIG_MONITOR_BAUD=115200 CONFIG_OPTIMIZATION_LEVEL_DEBUG=y CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG=y +CONFIG_COMPILER_OPTIMIZATION_DEFAULT=y # CONFIG_OPTIMIZATION_LEVEL_RELEASE is not set # CONFIG_COMPILER_OPTIMIZATION_LEVEL_RELEASE is not set CONFIG_OPTIMIZATION_ASSERTIONS_ENABLED=y @@ -1669,6 +1753,8 @@ CONFIG_ADC2_DISABLE_DAC=y # CONFIG_EVENT_LOOP_PROFILING is not set CONFIG_POST_EVENTS_FROM_ISR=y CONFIG_POST_EVENTS_FROM_IRAM_ISR=y +CONFIG_GDBSTUB_SUPPORT_TASKS=y +CONFIG_GDBSTUB_MAX_TASKS=32 # CONFIG_OTA_ALLOW_HTTP is not set # CONFIG_TWO_UNIVERSAL_MAC_ADDRESS is not set CONFIG_FOUR_UNIVERSAL_MAC_ADDRESS=y diff --git a/components/MPU6050/include/driver/MPU6050.h b/components/MPU6050/include/driver/MPU6050.h index 813381d..f6fc6e8 100644 --- a/components/MPU6050/include/driver/MPU6050.h +++ b/components/MPU6050/include/driver/MPU6050.h @@ -108,6 +108,14 @@ esp_err_t mpu_init(void); */ esp_err_t mpu_write_data(uint8_t reg, uint8_t value); +/** + * @brief + * + * @param gyro_coeff + * @return esp_err_t + */ +esp_err_t mpu_set_filter(float gyro_coeff); + /** * @brief * @@ -124,6 +132,36 @@ esp_err_t mpu_set_acc_config(uint8_t config_num); */ esp_err_t mpu_set_gyro_config(uint8_t config_num); +/** + * @brief + * + * @param x + * @param y + * @param z + * @return esp_err_t + */ +esp_err_t mpu_set_acc_offset(float x, float y, float z); + +/** + * @brief + * + * @param x + * @param y + * @param z + * @return esp_err_t + */ +esp_err_t mpu_set_gyro_offset(float x, float y, float z); + +/** + * @brief + * + * @param x + * @param y + * @param z + * @return esp_err_t + */ +esp_err_t mpu_set_angle_offset(float x, float y, float z); + /** * @brief Fetch data(read raw data) from the MPU6050 * @@ -138,6 +176,15 @@ esp_err_t mpu_fetch(void); */ esp_err_t mpu_update(void); +/** + * @brief + * + * @param is_calc_acc + * @param is_calc_gyro + * @return esp_err_t + */ +esp_err_t mpu_calc_offset(uint8_t is_calc_acc, uint8_t is_calc_gyro); + /** * @brief returns the angle X * @@ -166,6 +213,18 @@ float mpu_get_angle_z(void); */ float mpu_get_temp(void); +float mpu_get_acc_x_offset(void); + +float mpu_get_acc_y_offset(void); + +float mpu_get_acc_z_offset(void); + +float mpu_get_gyro_x_offset(void); + +float mpu_get_gyro_y_offset(void); + +float mpu_get_gyro_z_offset(void); + #ifdef __cplusplus } #endif \ No newline at end of file diff --git a/components/MPU6050/src/MPU6050.c b/components/MPU6050/src/MPU6050.c index 298b117..3bde701 100644 --- a/components/MPU6050/src/MPU6050.c +++ b/components/MPU6050/src/MPU6050.c @@ -4,13 +4,15 @@ static const char *TAG = "MPU"; /*-----MPU configs-----*/ uint8_t upside_down_mounting = 0; -float gyro_lsb_to_degsec, acc_lsb_to_g; -float gyroXoffset, gyroYoffset, gyroZoffset; -float accXoffset, accYoffset, accZoffset; +float acc_lsb_to_g, gyro_lsb_to_degsec; +float acc_x_offset, acc_y_offset, acc_z_offset; +float gyro_x_offset, gyro_y_offset, gyro_z_offset; +float angle_x_offset, angle_y_offset, angle_z_offset; /*-----result variables-----*/ float temp, acc_x, acc_y, acc_z, gyro_x, gyro_y, gyro_z; float angle_acc_x, angle_acc_y; +float raw_angle_x, raw_angle_y, raw_angle_z; float angle_x, angle_y, angle_z; int64_t pre_interval; float filter_gyro_coef; @@ -138,9 +140,14 @@ esp_err_t mpu_init(void) { vTaskDelay(100 / portTICK_PERIOD_MS); - mpu_set_acc_config(0); - mpu_set_gyro_config(0); + mpu_set_filter(DEFAULT_GYRO_COEFF); + mpu_set_acc_config(3); + mpu_set_gyro_config(3); + mpu_set_angle_offset(0, 0, 0); + // enable upside down mounting + upside_down_mounting = 1; + return ret; } @@ -201,6 +208,40 @@ esp_err_t mpu_set_gyro_config(uint8_t config_num){ return status; } +esp_err_t mpu_set_filter(float gyro_coeff) { + if ((gyro_coeff < 0) || (gyro_coeff > 1)) { + filter_gyro_coef = DEFAULT_GYRO_COEFF; + } // prevent bad gyro coeff, should throw an error... + + filter_gyro_coef = gyro_coeff; + + return ESP_OK; +} + +esp_err_t mpu_set_acc_offset(float x, float y, float z) { + acc_x_offset = x; + acc_y_offset = y; + acc_z_offset = z; + + return ESP_OK; +} + +esp_err_t mpu_set_gyro_offset(float x, float y, float z) { + gyro_x_offset = x; + gyro_y_offset = y; + gyro_z_offset = z; + + return ESP_OK; +} + +esp_err_t mpu_set_angle_offset(float x, float y, float z) { + angle_x_offset = x; + angle_y_offset = y; + angle_z_offset = z; + + return ESP_OK; +} + esp_err_t mpu_fetch(void) { uint8_t raw_data[14] = {}; @@ -245,17 +286,72 @@ esp_err_t mpu_update(void) { float dt = (new_time - pre_interval) / US_TO_S; pre_interval = new_time; - angle_x = wrap(filter_gyro_coef*(angle_acc_x + wrap(angle_x + gyro_x*dt - angle_acc_x,180)) + (1.0-filter_gyro_coef)*angle_acc_x,180); - angle_y = wrap(filter_gyro_coef*(angle_acc_y + wrap(angle_y + sg_z*gyro_y*dt - angle_acc_y, 90)) + (1.0-filter_gyro_coef)*angle_acc_y, 90); - angle_z += gyro_z * dt; // not wrapped + raw_angle_x = wrap(filter_gyro_coef*(angle_acc_x + wrap(raw_angle_x + gyro_x*dt - angle_acc_x,180)) + (1.0-filter_gyro_coef)*angle_acc_x,180); + raw_angle_y = wrap(filter_gyro_coef*(angle_acc_y + wrap(raw_angle_y + sg_z*gyro_y*dt - angle_acc_y, 90)) + (1.0-filter_gyro_coef)*angle_acc_y, 90); + raw_angle_z += gyro_z * dt; // not wrapped + + angle_x = raw_angle_x - angle_x_offset; + angle_y = raw_angle_y - angle_y_offset; + angle_z = raw_angle_z - angle_z_offset; + + return ESP_OK; +} + +esp_err_t mpu_calc_offset(uint8_t is_calc_acc, uint8_t is_calc_gyro) { + if(is_calc_acc){ + mpu_set_acc_offset(0, 0, 0); + } + + if(is_calc_gyro){ + mpu_set_gyro_offset(0,0,0); + } + + float ag[6] = {0,0,0,0,0,0}; // 3*acc, 3*gyro + + for(int i = 0; i < CALIB_OFFSET_NB_MES; i++){ + mpu_fetch(); + + ag[0] += acc_x; + ag[1] += acc_y; + ag[2] += (acc_z - 1.0); + ag[3] += gyro_x; + ag[4] += gyro_y; + ag[5] += gyro_z; + + vTaskDelay(pdMS_TO_TICKS(1)); // wait a little bit between 2 measurements + } + + if(is_calc_acc){ + acc_x_offset = ag[0] / CALIB_OFFSET_NB_MES; + acc_y_offset = ag[1] / CALIB_OFFSET_NB_MES; + acc_z_offset = ag[2] / CALIB_OFFSET_NB_MES; + } + + if(is_calc_gyro){ + gyro_x_offset = ag[3] / CALIB_OFFSET_NB_MES; + gyro_y_offset = ag[4] / CALIB_OFFSET_NB_MES; + gyro_z_offset = ag[5] / CALIB_OFFSET_NB_MES; + } return ESP_OK; } -float mpu_get_angle_x(void) { return angle_x;} +float mpu_get_angle_x(void) { return angle_x; } + +float mpu_get_angle_y(void) { return angle_y; } + +float mpu_get_angle_z(void) { return angle_z; } + +float mpu_get_temp(void) { return temp; } + +float mpu_get_acc_x_offset(void) { return acc_x_offset; } + +float mpu_get_acc_y_offset(void) { return acc_y_offset; } + +float mpu_get_acc_z_offset(void) { return acc_z_offset; } -float mpu_get_angle_y(void) { return angle_y;} +float mpu_get_gyro_x_offset(void) { return gyro_x_offset; } -float mpu_get_angle_z(void) { return angle_z;} +float mpu_get_gyro_y_offset(void) { return gyro_y_offset; } -float mpu_get_temp(void) {return temp;} +float mpu_get_gyro_z_offset(void) { return gyro_z_offset; } \ No newline at end of file diff --git a/components/RPM/CMakeLists.txt b/components/RPM/CMakeLists.txt new file mode 100644 index 0000000..4968b65 --- /dev/null +++ b/components/RPM/CMakeLists.txt @@ -0,0 +1,5 @@ +idf_component_register( + SRCS "src/rpm.c" + INCLUDE_DIRS "include" + REQUIRES system driver +) \ No newline at end of file diff --git a/components/RPM/idf_component.yml b/components/RPM/idf_component.yml new file mode 100644 index 0000000..1efc735 --- /dev/null +++ b/components/RPM/idf_component.yml @@ -0,0 +1,3 @@ +version: "1.0.0" +description: "RPM" +url: "https://github.com/Parahybaja/firmware" \ No newline at end of file diff --git a/components/RPM/include/task/rpm.h b/components/RPM/include/task/rpm.h new file mode 100644 index 0000000..419f700 --- /dev/null +++ b/components/RPM/include/task/rpm.h @@ -0,0 +1,41 @@ +/** + * @file alive.h + * @authors + * Jefferson Lopes (jefferson.lopes@ee.ufcg.edu.br) + * @brief calculate speed + * @version 1.0 + * @date 2024-03-08 + * + * @copyright Copyright (c) 2023 + * + * Version Modified By Date Comments + * ------- ------------- ---------- ----------- + * 0.3.0 Jefferson L. 26/10/2023 fix speed calculation + * 1.0.0 Jefferson L. 08/03/2024 idf convertion + * + */ + +#pragma once + +#include "system.h" +#include "driver/gpio.h" +#include "driver/pulse_cnt.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define TASK_RPM_SEND_RATE_Hz 2 // speedometer task send rate in hertz + +#define PCNT_HIGH_LIMIT 10000 +#define PCNT_LOW_LIMIT -10 + +/** + * @brief keep blinking a LED to ensure the CPU is working properly + * + */ +void task_rpm(void*); + +#ifdef __cplusplus +} +#endif diff --git a/components/RPM/src/rpm.c b/components/RPM/src/rpm.c new file mode 100644 index 0000000..4935a2a --- /dev/null +++ b/components/RPM/src/rpm.c @@ -0,0 +1,83 @@ +#include "task/rpm.h" + +static const char *TAG = "RPM"; + +void task_rpm(void *arg){ + (void)arg; + + const gpio_num_t gpio_pin = (gpio_num_t)arg; + + // create task variables + const int send_rate_ms = (int)(1000.0 / (float)(TASK_RPM_SEND_RATE_Hz)); + const float send_rate_min = 1 / ((float)TASK_RPM_SEND_RATE_Hz * 60.0f); + uint32_t timer_send_ms; + int pulse_count = 0; + sensor_t rpm = { + .type = RPM, + .value = 0.0 + }; + + /*-----config pulse counter-----*/ + ESP_LOGI(TAG, "install pcnt unit"); + pcnt_unit_config_t unit_config = { + .high_limit = PCNT_HIGH_LIMIT, + .low_limit = PCNT_LOW_LIMIT, + }; + + pcnt_unit_handle_t pcnt_unit = NULL; + ESP_ERROR_CHECK(pcnt_new_unit(&unit_config, &pcnt_unit)); + + ESP_LOGI(TAG, "set glitch filter"); + pcnt_glitch_filter_config_t filter_config = { + .max_glitch_ns = 100, + }; + ESP_ERROR_CHECK(pcnt_unit_set_glitch_filter(pcnt_unit, &filter_config)); + + pcnt_chan_config_t chan_config = { + .edge_gpio_num = gpio_pin, + .level_gpio_num = -1, + .flags.virt_level_io_level = false, + }; + pcnt_channel_handle_t pcnt_chan = NULL; + ESP_ERROR_CHECK(pcnt_new_channel(pcnt_unit, &chan_config, &pcnt_chan)); + + ESP_ERROR_CHECK(pcnt_channel_set_edge_action(pcnt_chan, PCNT_CHANNEL_EDGE_ACTION_INCREASE, PCNT_CHANNEL_EDGE_ACTION_HOLD)); + + ESP_LOGI(TAG, "enable pcnt unit"); + ESP_ERROR_CHECK(pcnt_unit_enable(pcnt_unit)); + ESP_LOGI(TAG, "clear pcnt unit"); + ESP_ERROR_CHECK(pcnt_unit_clear_count(pcnt_unit)); + ESP_LOGI(TAG, "start pcnt unit"); + ESP_ERROR_CHECK(pcnt_unit_start(pcnt_unit)); + + // show remaining task space + print_task_remaining_space(); + + // -----update timer----- + timer_send_ms = esp_log_timestamp(); + + for (;;) { + if ((esp_log_timestamp() - timer_send_ms) >= send_rate_ms){ + // -----add to timer----- + timer_send_ms += send_rate_ms; + + // -----get counts----- + esp_err_t err = pcnt_unit_get_count(pcnt_unit, &pulse_count); + pcnt_unit_clear_count(pcnt_unit); + + if (err == ESP_OK) { + // -----calculate----- + rpm.value = pulse_count / send_rate_min; // general rpm calculation + rpm.value /= 2.0f; // compensate for the double peak of the signal + + // -----send spped data through esp-now to receiver----- + esp_now_send(mac_address_ECU_front, (uint8_t *) &rpm, sizeof(rpm)); + } + else { + ESP_LOGE(TAG, "error getting PCNT value"); + } + } + + vTaskDelay(pdMS_TO_TICKS(10)); // free up the processor + } +} diff --git a/components/battery/src/battery.c b/components/battery/src/battery.c index f8029f6..6c4ae74 100644 --- a/components/battery/src/battery.c +++ b/components/battery/src/battery.c @@ -31,7 +31,7 @@ void task_battery(void *arg){ adc_oneshot_chan_cfg_t config = { .bitwidth = ADC_BITWIDTH_DEFAULT, - .atten = ADC_ATTEN_DB_12, + .atten = ADC_ATTEN_DB_11, }; ESP_ERROR_CHECK(adc_oneshot_config_channel(adc1_handle, battery_config->adc_channel, &config)); diff --git a/components/blind_spot/CMakeLists.txt b/components/blind_spot/CMakeLists.txt new file mode 100644 index 0000000..e9d9f0f --- /dev/null +++ b/components/blind_spot/CMakeLists.txt @@ -0,0 +1,5 @@ +idf_component_register( + SRCS "src/blind_spot.c" + INCLUDE_DIRS "include" + REQUIRES system driver +) \ No newline at end of file diff --git a/components/blind_spot/idf_component.yml b/components/blind_spot/idf_component.yml new file mode 100644 index 0000000..0a710d5 --- /dev/null +++ b/components/blind_spot/idf_component.yml @@ -0,0 +1,3 @@ +version: "0.1.0" +description: "task example" +url: "https://github.com/Parahybaja/firmware" \ No newline at end of file diff --git a/components/blind_spot/include/task/blind_spot.h b/components/blind_spot/include/task/blind_spot.h new file mode 100644 index 0000000..cc0750a --- /dev/null +++ b/components/blind_spot/include/task/blind_spot.h @@ -0,0 +1,35 @@ +/** + * @file task_blind_spot.h + * @author Flaviano Medeiros da Silva Júnior (flaviano.medeiros@estudante.ufcg.edu.br) + * @brief task blind spot + * @version 0.1 + * @date 2024-01-22 + * + * @copyright Copyright (c) 2024 + * + * Version Modified By Date Comments + * ------- ------------- ---------- ----------- + * 0.1.0 Flaviano Jr. 22/01/2024 first version + * + */ + +#pragma once + +#include "system.h" +#include "driver/gpio.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define TASK_BLIND_SPOT_SEND_RATE_Hz 1 // RPM task send rate in hertz + +#define ACTIVE_LOW false +#define BLIND_SPOT_AVERAGE_POINTS 5 +#define THRESHOLD 1 // to be calibrated + +void task_blind_spot(void*); + +#ifdef __cplusplus +} +#endif \ No newline at end of file diff --git a/components/blind_spot/sketch_jan29a/sketch_jan29a.ino b/components/blind_spot/sketch_jan29a/sketch_jan29a.ino new file mode 100644 index 0000000..2f69321 --- /dev/null +++ b/components/blind_spot/sketch_jan29a/sketch_jan29a.ino @@ -0,0 +1,39 @@ +#include + +#define RX_PIN 3 // GPIO3 (RX0) como RX (pino de recepção) +#define TX_PIN 1 // GPIO1 como TX (pino de transmissão) +#define SERIAL_BAUD 9600 // Taxa de baud para comunicação serial + +void setup() { + Serial.begin(SERIAL_BAUD); +} + +void loop() { + getDistance(); + delay(100); // Adiciona um pequeno atraso entre leituras +} + +void getDistance() { + unsigned int distance; + byte startByte, h_data, l_data, sum = 0; + byte buf[3]; + + // Espera até que pelo menos 3 bytes estejam disponíveis + while (Serial.available() < 3) { + delay(10); + } + + Serial.readBytes(buf, 3); + startByte = buf[0]; + h_data = buf[1]; + l_data = buf[2]; + sum = h_data + l_data; + + if (startByte == 255 && sum == buf[2]) { + distance = (h_data << 8) + l_data; + Serial.print("Distância [mm]: "); + Serial.println(distance); + } else { + Serial.println("Resultado inválido"); + } +} \ No newline at end of file diff --git a/components/blind_spot/src/blind_spot.c b/components/blind_spot/src/blind_spot.c new file mode 100644 index 0000000..1b22f76 --- /dev/null +++ b/components/blind_spot/src/blind_spot.c @@ -0,0 +1,72 @@ +#include "task/blind_spot.h" + +static const char *TAG = "blind_spot"; + +void task_blind_spot(void *arg){ + (void)arg; + + const gpio_num_t gpio_pin = (gpio_num_t)arg; + + // -----config gpio----- + //zero-initialize the config structure. + gpio_config_t io_conf = {}; + io_conf.intr_type = GPIO_INTR_DISABLE; + io_conf.mode = GPIO_MODE_INPUT; + io_conf.pin_bit_mask = (1ULL<= send_rate_ms) + { + // -----add to timer----- + timer_send_ms += send_rate_ms; + + // -----calculate----- + sum = 0; // clean sum buffer + for (int i=0; i < BLIND_SPOT_AVERAGE_POINTS; i++) { + if (ACTIVE_LOW) + sum += !gpio_get_level(gpio_pin); + else + sum += gpio_get_level(gpio_pin); + } + blind_sr.value = sum / (float)(BLIND_SPOT_AVERAGE_POINTS); + + // ----- define high or low level ----- + // comment out to send raw data fuel average + if (blind_sr.value <= THRESHOLD){ // low fuel level + blind_sr.value = 0; // active low fuel emergency flag + } + else { + blind_sr.value = 1; + } + + // ----- send data just when is changed ----- + if (blind_sr.value != last_value) { + // -----send fuel data through esp-now to receiver----- + ESP_LOGD(TAG, "Blind Spot, detected"); + printf("Pin Level: %f\n",sum); + // esp_now_send(mac_address_ECU_rear, (uint8_t *) &blind_spot_right, sizeof(blind_spot_right)); + // esp_now_send(mac_address_ECU_rear, (uint8_t *) &blind_spot_left, sizeof(blind_spot_left)); + }; + + // ----- update last value ----- + last_value = blind_sr.value; + } + + vTaskDelay(pdMS_TO_TICKS(10)); // free up the processor + } +} \ No newline at end of file diff --git a/components/display/include/task/display.h b/components/display/include/task/display.h index 7c8e35f..a091b4d 100644 --- a/components/display/include/task/display.h +++ b/components/display/include/task/display.h @@ -1,10 +1,11 @@ /** - * @file task_display.h + * @file display.h * @authors * Jefferson Lopes (jefferson.lopes@ee.ufcg.edu.br) * Raynoan Emilly (raynoan.batista@ee.ufcg.edu.br) + * Mariana Lira () * @brief Task display - * @version 1.0 + * @version 1.1 * @date 2024-02-14 * * @copyright Copyright (c) 2024 @@ -12,7 +13,9 @@ * Version Modified By Date Comments * ------- ------------- ---------- ----------- * 0.1.0 Jefferson L. 10/02/2023 first version - * + * 1.0.0 Raynoan E. 18/01/2024 convertion to esp-idf + * 1.0.1 Jefferson L. 18/03/2024 fix read queue overflow + * 1.0.2 Mariana L. add enduro mode */ #pragma once @@ -28,41 +31,48 @@ extern "C" { /* nextion pages */ #define NEX_PAGE_NAME_INTRO "page0" -#define NEX_PAGE_NAME_DARK "page1" -#define NEX_PAGE_NAME_LIGHT "page2" -#define NEX_PAGE_NAME_ENDURO "page3" +#define NEX_PAGE_NAME_LIGHT "page1" +#define NEX_PAGE_NAME_ENDURO "page2" #define NEX_PAGE_ID_INTRO 0 -#define NEX_PAGE_ID_DARK 1 -#define NEX_PAGE_ID_LIGHT 2 -#define NEX_PAGE_ID_ENDURO 3 - -/* nextion dark components */ -#define NEX_TEXT_SPEED_D "p1t0" -#define NEX_TEXT_BATTERY_D "p1t1" -#define NEX_TEXT_TEMP_D "p1t2" -#define NEX_TEXT_ROLL_D "p1t3" -#define NEX_TEXT_PITCH_D "p1t4" -#define NEX_DSBUTTON_FUEL_EM_D "p1bt0" -#define NEX_PROGRESSBAR_RPM_D "p1j0" +#define NEX_PAGE_ID_LIGHT 1 +#define NEX_PAGE_ID_ENDURO 2 /* nextion light components */ -#define NEX_TEXT_SPEED_L "p2t0" -#define NEX_TEXT_BATTERY_L "p2t1" -#define NEX_TEXT_TEMP_L "p2t2" -#define NEX_TEXT_ROLL_L "p2t3" -#define NEX_TEXT_PITCH_L "p2t4" -#define NEX_DSBUTTON_FUEL_EM_L "p2bt0" -#define NEX_PROGRESSBAR_RPM_L "p2j0" +#define NEX_TEXT_SPEED_L "p1t0" +#define NEX_TEXT_TEMP_L "p1t1" +#define NEX_TEXT_ROLL_L "p1t3" +#define NEX_TEXT_PITCH_L "p1t4" +#define NEX_TEXT_BATTERY_L "p1t2" +#define NEX_DSBUTTON_FUEL_EM_L "p1t5" +#define NEX_PROGRESSBAR_RPM_L "p1j0" +#define NEX_TEXT_INFRARED "p1t6" + +/* nextion enduro components */ +#define NEX_TEXT_HOUR_L "p2t2" +#define NEX_TEXT_MINUTE_L "p2t3" +#define NEX_TEXT_SECOND_L "p2t5" +#define NEX_TEXT_LAP_L "p2t4" +#define NEX_TEXT_LAP_MINUTES_L "p2t6" +#define NEX_TEXT_LAP_SECONDS_L "p2t7" +#define NEX_BUTTON_LAP_L "b0" +#define NEX_DSBUTTON_PAUSE_L "bt0" /* nextion symbols */ #define NEX_SYMBOL_DEGREE 0xB0 // hex value for ° #define NEX_SYMBOL_PERCENT 0x25 // hex value for % /* nextion configs */ -#define NEX_RPM_MAX (float)4000 +#define NEX_RPM_MAX (float)5000 #define NEX_RPM_MIN (float)0 #define NEX_BAT_MAX (float)12.8 // battery 100% #define NEX_BAT_MIN (float)11.0 // battery 0% +#define NEX_HOUR_MAX (int)4 // initial timer +#define NEX_HOUR_MIN (int)0 +#define NEX_MINUTE_MAX (int)59 +#define NEX_MINUTE_MIN (int)0 +#define NEX_SECOND_MAX (int)59 +#define NEX_SECOND_MIN (int)0 +# /** * @brief diff --git a/components/display/src/display.c b/components/display/src/display.c index afd3bb9..91c9d10 100644 --- a/components/display/src/display.c +++ b/components/display/src/display.c @@ -9,7 +9,7 @@ int current_page_num; void task_display(void *arg) { (void)arg; - sensor_t recv_sensor = {}; + sensor_t recv_sensor; char msg_buffer[10]; float percent; @@ -50,10 +50,6 @@ void task_display(void *arg) { ESP_LOGI(TAG, "page:%i", current_page_num); vTaskDelay(pdMS_TO_TICKS(2000)); - - nextion_page_set(nextion_handle, NEX_PAGE_NAME_DARK); - current_page_num = NEX_PAGE_ID_DARK; - ESP_LOGI(TAG, "page:%i", current_page_num); } print_task_remaining_space(); @@ -63,7 +59,7 @@ void task_display(void *arg) { for (;;) { // speed - if (xQueueReceive(qh_speed, &recv_sensor, pdMS_TO_TICKS(1))){ + if (xQueueReceive(qh_speed, &recv_sensor, pdMS_TO_TICKS(0))){ // update global system var in a protected environment xSemaphoreTake(sh_global_vars, portMAX_DELAY); system_global.speed = recv_sensor.value; @@ -73,10 +69,7 @@ void task_display(void *arg) { if (nex_init_err == 0) { // print to display snprintf(msg_buffer, 10, "%d", (int)recv_sensor.value); - if (current_page_num == NEX_PAGE_ID_DARK) { - nextion_component_set_text(nextion_handle, NEX_TEXT_SPEED_D, msg_buffer); - } - else if (current_page_num == NEX_PAGE_ID_LIGHT) { + if (current_page_num == NEX_PAGE_ID_LIGHT) { nextion_component_set_text(nextion_handle, NEX_TEXT_SPEED_L, msg_buffer); } memset(msg_buffer, 0, sizeof(msg_buffer)); // clear buffer @@ -84,7 +77,7 @@ void task_display(void *arg) { } // RPM - else if (xQueueReceive(qh_rpm, &recv_sensor, pdMS_TO_TICKS(1))){ + if (xQueueReceive(qh_rpm, &recv_sensor, pdMS_TO_TICKS(0))){ // update global system var in a protected environment xSemaphoreTake(sh_global_vars, portMAX_DELAY); system_global.rpm = recv_sensor.value; @@ -95,17 +88,14 @@ void task_display(void *arg) { percent = convert_to_percent(recv_sensor.value, NEX_RPM_MAX, NEX_RPM_MIN); // print to display - if (current_page_num == NEX_PAGE_ID_DARK) { - nextion_component_set_value(nextion_handle, NEX_PROGRESSBAR_RPM_D, percent); - } - else if (current_page_num == NEX_PAGE_ID_LIGHT) { + if (current_page_num == NEX_PAGE_ID_LIGHT) { nextion_component_set_value(nextion_handle, NEX_PROGRESSBAR_RPM_L, percent); } } } // fuel - else if (xQueueReceive(qh_fuel_emer, &recv_sensor, pdMS_TO_TICKS(1))){ + if (xQueueReceive(qh_fuel_emer, &recv_sensor, pdMS_TO_TICKS(0))){ // update global system var in a protected environment xSemaphoreTake(sh_global_vars, portMAX_DELAY); system_global.fuel_em = recv_sensor.value; @@ -114,17 +104,70 @@ void task_display(void *arg) { /* if there's no error with the nextion initialization */ if (nex_init_err == 0) { // print to display - if (current_page_num == NEX_PAGE_ID_DARK) { - nextion_component_set_boolean(nextion_handle, NEX_DSBUTTON_FUEL_EM_D, (bool)recv_sensor.value); - } - else if (current_page_num == NEX_PAGE_ID_LIGHT) { + if (current_page_num == NEX_PAGE_ID_LIGHT) { nextion_component_set_boolean(nextion_handle, NEX_DSBUTTON_FUEL_EM_L, (bool)recv_sensor.value); } } } + // temperature + if (xQueueReceive(qh_temp, &recv_sensor, pdMS_TO_TICKS(0))){ + // update global system var in a protected environment + xSemaphoreTake(sh_global_vars, portMAX_DELAY); + system_global.temp = recv_sensor.value; + xSemaphoreGive(sh_global_vars); + + /* if there's no error with the nextion initialization */ + if (nex_init_err == 0) { + // print to display + snprintf(msg_buffer, 10, "%d", (int)recv_sensor.value); + if (current_page_num == NEX_PAGE_ID_LIGHT) { + nextion_component_set_text(nextion_handle, NEX_TEXT_TEMP_L, msg_buffer); + } + memset(msg_buffer, 0, sizeof(msg_buffer)); // clear buffer + } + } + + // tilt_x - roll + if (xQueueReceive(qh_tilt_x, &recv_sensor, pdMS_TO_TICKS(0))){ + // update global system var in a protected environment + xSemaphoreTake(sh_global_vars, portMAX_DELAY); + system_global.tilt_x = recv_sensor.value; + xSemaphoreGive(sh_global_vars); + + /* if there's no error with the nextion initialization */ + if (nex_init_err == 0) { + // print to display + snprintf(msg_buffer, 10, "%d%c", (int)recv_sensor.value, NEX_SYMBOL_DEGREE); + if (current_page_num == NEX_PAGE_ID_LIGHT) { + nextion_component_set_text(nextion_handle, NEX_TEXT_ROLL_L, msg_buffer); + } + memset(msg_buffer, 0, sizeof(msg_buffer)); // clear buffer + } + } + + // tilt_y - pitch + if (xQueueReceive(qh_tilt_y, &recv_sensor, pdMS_TO_TICKS(0))){ + // update global system var in a protected environment + xSemaphoreTake(sh_global_vars, portMAX_DELAY); + system_global.tilt_y = recv_sensor.value; + xSemaphoreGive(sh_global_vars); + + /* if there's no error with the nextion initialization */ + if (nex_init_err == 0) { + // print to display + snprintf(msg_buffer, 10, "%d%c", (int)recv_sensor.value, NEX_SYMBOL_DEGREE); + if (current_page_num == NEX_PAGE_ID_LIGHT) { + nextion_component_set_text(nextion_handle, NEX_TEXT_PITCH_L, msg_buffer); + } + memset(msg_buffer, 0, sizeof(msg_buffer)); // clear buffer + } + + memset(&recv_sensor, 0, sizeof(recv_sensor)); + } + // battery - else if (xQueueReceive(qh_battery, &recv_sensor, pdMS_TO_TICKS(1))){ + if (xQueueReceive(qh_battery, &recv_sensor, pdMS_TO_TICKS(0))){ // update global system var in a protected environment xSemaphoreTake(sh_global_vars, portMAX_DELAY); system_global.battery = recv_sensor.value; @@ -135,80 +178,137 @@ void task_display(void *arg) { percent = convert_to_percent(recv_sensor.value, NEX_BAT_MAX, NEX_BAT_MIN); // print to display - snprintf(msg_buffer, 10, "%d%c", (int)percent, NEX_SYMBOL_PERCENT); - if (current_page_num == NEX_PAGE_ID_DARK) { - nextion_component_set_text(nextion_handle, NEX_TEXT_BATTERY_D, msg_buffer); - } - else if (current_page_num == NEX_PAGE_ID_LIGHT) { + snprintf(msg_buffer, 10, "%d", (int)percent); + if (current_page_num == NEX_PAGE_ID_LIGHT) { nextion_component_set_text(nextion_handle, NEX_TEXT_BATTERY_L, msg_buffer); } memset(msg_buffer, 0, sizeof(msg_buffer)); // clear buffer } } - - // temperature - else if (xQueueReceive(qh_temp, &recv_sensor, pdMS_TO_TICKS(1))){ + // infrared sensor + if (xQueueReceive(qh_infrared, &recv_sensor, pdMS_TO_TICKS(0))){ // update global system var in a protected environment xSemaphoreTake(sh_global_vars, portMAX_DELAY); - system_global.temp = recv_sensor.value; + system_global.infrared = recv_sensor.value; xSemaphoreGive(sh_global_vars); /* if there's no error with the nextion initialization */ if (nex_init_err == 0) { // print to display - snprintf(msg_buffer, 10, "%d%cC", (int)recv_sensor.value, NEX_SYMBOL_DEGREE); - if (current_page_num == NEX_PAGE_ID_DARK) { - nextion_component_set_text(nextion_handle, NEX_TEXT_TEMP_D, msg_buffer); + if (current_page_num == NEX_PAGE_ID_LIGHT) { + nextion_component_set_boolean(nextion_handle, NEX_TEXT_INFRARED, (bool)recv_sensor.value); } - else if (current_page_num == NEX_PAGE_ID_LIGHT) { - nextion_component_set_text(nextion_handle, NEX_TEXT_TEMP_L, msg_buffer); + } + } + + // timer - hour + if (xQueueReceive(qh_hours, &recv_sensor, pdMS_TO_TICKS(0))) { + // update global system var in a protected environment + xSemaphoreTake(sh_global_vars, portMAX_DELAY); + system_global.hours = recv_sensor.value; + xSemaphoreGive(sh_global_vars); + + /* if there's no error with the nextion initialization */ + if (nex_init_err == 0) { + // print to display + snprintf(msg_buffer, 10, "%02d", (int)recv_sensor.value); + if (current_page_num == NEX_PAGE_ID_ENDURO) { + nextion_component_set_text(nextion_handle, NEX_TEXT_HOUR_L, msg_buffer); } memset(msg_buffer, 0, sizeof(msg_buffer)); // clear buffer } } - // tilt_x - roll - else if (xQueueReceive(qh_tilt_x, &recv_sensor, pdMS_TO_TICKS(1))){ + // timer - minutes + if (xQueueReceive(qh_minutes, &recv_sensor, pdMS_TO_TICKS(0))) { // update global system var in a protected environment xSemaphoreTake(sh_global_vars, portMAX_DELAY); - system_global.tilt_x = recv_sensor.value; + system_global.minutes = recv_sensor.value; xSemaphoreGive(sh_global_vars); /* if there's no error with the nextion initialization */ if (nex_init_err == 0) { // print to display - snprintf(msg_buffer, 10, "%d%c", (int)recv_sensor.value, NEX_SYMBOL_DEGREE); - if (current_page_num == NEX_PAGE_ID_DARK) { - nextion_component_set_text(nextion_handle, NEX_TEXT_ROLL_D, msg_buffer); - } - else if (current_page_num == NEX_PAGE_ID_LIGHT) { - nextion_component_set_text(nextion_handle, NEX_TEXT_ROLL_L, msg_buffer); + snprintf(msg_buffer, 10, "%02d", (int)recv_sensor.value); + if (current_page_num == NEX_PAGE_ID_ENDURO) { + nextion_component_set_text(nextion_handle, NEX_TEXT_MINUTE_L, msg_buffer); } memset(msg_buffer, 0, sizeof(msg_buffer)); // clear buffer } } - // tilt_y - pitch - else if (xQueueReceive(qh_tilt_y, &recv_sensor, pdMS_TO_TICKS(1))){ + // timer - seconds + if (xQueueReceive(qh_seconds, &recv_sensor, pdMS_TO_TICKS(0))) { // update global system var in a protected environment xSemaphoreTake(sh_global_vars, portMAX_DELAY); - system_global.tilt_y = recv_sensor.value; + system_global.seconds = recv_sensor.value; xSemaphoreGive(sh_global_vars); /* if there's no error with the nextion initialization */ if (nex_init_err == 0) { // print to display - snprintf(msg_buffer, 10, "%d%c", (int)recv_sensor.value, NEX_SYMBOL_DEGREE); - if (current_page_num == NEX_PAGE_ID_DARK) { - nextion_component_set_text(nextion_handle, NEX_TEXT_PITCH_D, msg_buffer); - } - else if (current_page_num == NEX_PAGE_ID_LIGHT) { - nextion_component_set_text(nextion_handle, NEX_TEXT_PITCH_L, msg_buffer); + snprintf(msg_buffer, 10, "%02d", (int)recv_sensor.value); + if (current_page_num == NEX_PAGE_ID_ENDURO) { + nextion_component_set_text(nextion_handle, NEX_TEXT_SECOND_L, msg_buffer); } memset(msg_buffer, 0, sizeof(msg_buffer)); // clear buffer } } + // lap + // if (xQueueReceive(qh_lap, &recv_sensor, pdMS_TO_TICKS(0))) { + // //update global system var in a protected environment + // xSemaphoreTake(sh_global_vars, portMAX_DELAY); + // system_global.lap = recv_sensor.value; + // xSemaphoreGive(sh_global_vars); + + // /* if there's no error with the nextion initialization */ + // if (nex_init_err == 0) { + // //print to display + // snprintf(msg_buffer, 10, "%d", (int)recv_sensor.value); + // if (current_page_num == NEX_PAGE_ID_ENDURO) { + // nextion_component_set_text(nextion_handle, NEX_TEXT_LAP_L, msg_buffer); + // } + // memset(msg_buffer, 0, sizeof(msg_buffer)); // clear buffer + // } + // } + + // // lap time - minutes + // if (xQueueReceive(qh_lap_minutes, &recv_sensor, pdMS_TO_TICKS(0))) { + // // update global system var in a protected environment + // xSemaphoreTake(sh_global_vars, portMAX_DELAY); + // system_global.lap_minutes = recv_sensor.value; + // xSemaphoreGive(sh_global_vars); + + // /* if there's no error with the nextion initialization */ + // if (nex_init_err == 0) { + // //print to display + // snprintf(msg_buffer, 10, "%02d", (int)recv_sensor.value); + // if (current_page_num == NEX_PAGE_ID_ENDURO) { + // nextion_component_set_text(nextion_handle, NEX_TEXT_LAP_MINUTES_L, msg_buffer); + // } + // memset(msg_buffer, 0, sizeof(msg_buffer)); // clear buffer + // } + // } + + // // lap time - seconds + // if (xQueueReceive(qh_lap_seconds, &recv_sensor, pdMS_TO_TICKS(0))) { + // // update global system var in a protected environment + // xSemaphoreTake(sh_global_vars, portMAX_DELAY); + // system_global.lap_seconds = recv_sensor.value; + // xSemaphoreGive(sh_global_vars); + + // /* if there's no error with the nextion initialization */ + // if (nex_init_err == 0) { + // //print to display + // snprintf(msg_buffer, 10, "%02d", (int)recv_sensor.value); + // if (current_page_num == NEX_PAGE_ID_ENDURO) { + // nextion_component_set_text(nextion_handle, NEX_TEXT_LAP_SECONDS_L, msg_buffer); + // } + // memset(msg_buffer, 0, sizeof(msg_buffer)); // clear buffer + // } + // } + vTaskDelay(pdMS_TO_TICKS(10)); } } @@ -225,7 +325,7 @@ void callback_touch_event(nextion_on_touch_event_t event){ eSetValueWithOverwrite ); } - else if (event.page_id == NEX_PAGE_ID_DARK && event.state == NEXTION_TOUCH_PRESSED) { + else if (event.page_id == NEX_PAGE_ID_LIGHT && event.state == NEXTION_TOUCH_PRESSED) { ESP_LOGI(TAG, "page 1 pressed"); xTaskNotify( @@ -234,7 +334,7 @@ void callback_touch_event(nextion_on_touch_event_t event){ eSetValueWithOverwrite ); } - else if (event.page_id == NEX_PAGE_ID_LIGHT && event.state == NEXTION_TOUCH_PRESSED) { + else if (event.page_id == NEX_PAGE_ID_ENDURO && event.state == NEXTION_TOUCH_PRESSED) { ESP_LOGI(TAG, "page 2 pressed"); xTaskNotify( @@ -253,16 +353,16 @@ void process_callback_queue(void *arg){ /* change pages logic */ if (notify_page_id == NEX_PAGE_ID_INTRO){ - nextion_page_set(nextion_handle, NEX_PAGE_NAME_DARK); - current_page_num = NEX_PAGE_ID_DARK; - } - else if (notify_page_id == NEX_PAGE_ID_DARK){ nextion_page_set(nextion_handle, NEX_PAGE_NAME_LIGHT); current_page_num = NEX_PAGE_ID_LIGHT; } else if (notify_page_id == NEX_PAGE_ID_LIGHT){ - nextion_page_set(nextion_handle, NEX_PAGE_NAME_DARK); - current_page_num = NEX_PAGE_ID_DARK; + nextion_page_set(nextion_handle, NEX_PAGE_NAME_ENDURO); + current_page_num = NEX_PAGE_ID_ENDURO; + } + else if (notify_page_id == NEX_PAGE_ID_ENDURO){ + nextion_page_set(nextion_handle, NEX_PAGE_NAME_LIGHT); + current_page_num = NEX_PAGE_ID_LIGHT; } else { ESP_LOGE(TAG, "undefined touch id"); diff --git a/components/infrared/CMakeLists.txt b/components/infrared/CMakeLists.txt new file mode 100644 index 0000000..ab9fcca --- /dev/null +++ b/components/infrared/CMakeLists.txt @@ -0,0 +1,5 @@ +idf_component_register( + SRCS "src/infrared.c" + INCLUDE_DIRS "include" + REQUIRES system driver +) \ No newline at end of file diff --git a/components/infrared/idf_component.yml b/components/infrared/idf_component.yml new file mode 100644 index 0000000..05602b7 --- /dev/null +++ b/components/infrared/idf_component.yml @@ -0,0 +1,3 @@ +version: "1.0.0" +description: "task infrared" +url: "https://github.com/Parahybaja/firmware" \ No newline at end of file diff --git a/components/infrared/include/task/infrared.h b/components/infrared/include/task/infrared.h new file mode 100644 index 0000000..8480139 --- /dev/null +++ b/components/infrared/include/task/infrared.h @@ -0,0 +1,37 @@ +/** + * @file infrared.h + * @authors + * Raynoan Emilly (raynoan.batista@ee.ufcg.edu.br) + * Flaviano Medeiros (flaviano.medeiros@estudante.ufcg.edu.br) + * @brief Infrared sensor task + * @version 0.1 + * @date 2024-10-23 + * + * @copyright Copyright (c) 2024 + * + * Version Modified By Date Comments + * ------- ------------- ---------- ----------- + * 0.1.0 Raynoan Emilly 23/09/2024 First version + */ + +#pragma once + +#include +#include +#include +#include "driver/gpio.h" +#include "system.h" + +#ifdef __cplusplus +extern "C" { +#endif +#define TASK_INFRARED_RATE_Hz 1 // reading rate in hertz +#define pin_infrared GPIO_NUM_26 +#define queue_size 10 +#define DEBOUNCE_DELAY_MS 100 + +void task_infrared(void*); + +#ifdef __cplusplus +} +#endif diff --git a/components/infrared/src/infrared.c b/components/infrared/src/infrared.c new file mode 100644 index 0000000..6d7dfdc --- /dev/null +++ b/components/infrared/src/infrared.c @@ -0,0 +1,67 @@ +#include "task/infrared.h" + +static const char *TAG = "infrared"; + +static TickType_t last_interrupt_time = 0; +static QueueHandle_t gpio_evt_queue = NULL; + +static void pin_config(void) { + esp_rom_gpio_pad_select_gpio(pin_infrared); + gpio_set_direction(pin_infrared, GPIO_MODE_INPUT); + gpio_pullup_dis(pin_infrared); + gpio_pulldown_dis(pin_infrared); + gpio_set_intr_type(pin_infrared, GPIO_INTR_ANYEDGE); // Interrupção na borda de descida e subida +} + +static void IRAM_ATTR infrared_handler(void* arg) { + uint32_t io_num = (uint32_t)arg; + TickType_t current_time = xTaskGetTickCount(); + + if ((current_time - last_interrupt_time) * portTICK_PERIOD_MS > DEBOUNCE_DELAY_MS) { + last_interrupt_time = current_time; + BaseType_t higher_priority_task_woken = pdFALSE; + sensor_t infrared = {INFRARED, gpio_get_level(pin_infrared) ? 1.0 : 0.0}; // Atualiza com o nível atual do pino + xQueueSendFromISR(gpio_evt_queue, &infrared, &higher_priority_task_woken); + portYIELD_FROM_ISR(higher_priority_task_woken); + } +} + +void task_infrared(void* arg) { + sensor_t infrared = {INFRARED, 0.0}; + bool last_value = false; + + // Configuração do pino e interrupção + pin_config(); + gpio_evt_queue = xQueueCreate(queue_size, sizeof(sensor_t)); + if (gpio_evt_queue == NULL) { + ESP_LOGE(TAG, "Failed to create queue"); + vTaskDelete(NULL); + } + + esp_err_t ret = gpio_install_isr_service(0); + if (ret != ESP_OK) { + ESP_LOGE(TAG, "Failed to install ISR service: %s", esp_err_to_name(ret)); + vTaskDelete(NULL); + } + + gpio_isr_handler_add(pin_infrared, infrared_handler, (void*)pin_infrared); + + // Loop da task + for (;;) { + // Tenta receber um evento da fila, com tempo limite + if (xQueueReceive(gpio_evt_queue, &infrared, portMAX_DELAY)) { + // Verifica o estado do sensor e atualiza a variável de estado + last_value = (infrared.value == 1.0); + } + + // Verifica o estado do sensor atual e registra a ativação/desativação + if (last_value) { + ESP_LOGI(TAG, "4x4 is deactivated"); + } else { + ESP_LOGI(TAG, "4x4 is activated"); + } + + // Atraso para liberar o processador + vTaskDelay(pdMS_TO_TICKS(10)); + } +} diff --git a/components/rollover/include/task/rollover.h b/components/rollover/include/task/rollover.h index e51008e..22deaff 100644 --- a/components/rollover/include/task/rollover.h +++ b/components/rollover/include/task/rollover.h @@ -31,13 +31,12 @@ extern "C" { #define MPU_ACC_CONFIG 3 /*-----MPU offset-----*/ -#define CALIB_ACC_X 0.531088 // usada para definir o zero do eixo x -#define CALIB_ACC_Y 0.045418 // usada para definir o zero do eixo y -#define CALIB_ACC_Z -0.308320 // usada para definir o zero do eixo z -#define CALIB_GYRO_X -1.591225 // usada para definir o zero do eixo x -#define CALIB_GYRO_Y -0.218293 // usada para definir o zero do eixo y -#define CALIB_GYRO_Z 0.441586 // usada para definir o zero do eixo z -#define CALIBRATE false +#define CALIB_ACC_X 0.126168 // usada para definir o zero do eixo x +#define CALIB_ACC_Y -0.016679 // usada para definir o zero do eixo y +#define CALIB_ACC_Z -0.272904 // usada para definir o zero do eixo z +#define CALIB_GYRO_X -2.928174 // usada para definir o zero do eixo x +#define CALIB_GYRO_Y -0.410976 // usada para definir o zero do eixo y +#define CALIB_GYRO_Z -0.131342 // usada para definir o zero do eixo z /** * @brief MPU6050 rollover sensor task diff --git a/components/rollover/src/rollover.c b/components/rollover/src/rollover.c index 3b3be46..024f1f4 100644 --- a/components/rollover/src/rollover.c +++ b/components/rollover/src/rollover.c @@ -3,7 +3,8 @@ static const char *TAG = "task_rollover"; void task_rollover(void *arg){ - (void)arg; + + const uint8_t calibrate = (uint8_t)arg; // -----create local variables----- const int send_rate_ms = (int)(1000.0 / (float)(TASK_ROLLOVER_RATE_Hz)); @@ -47,28 +48,33 @@ void task_rollover(void *arg){ vTaskDelete(NULL); } - if (CALIBRATE == true) { + if (calibrate == true) { ESP_LOGW(TAG, "Calculating offsets, do not move MPU6050"); vTaskDelay(pdMS_TO_TICKS(500)); /*call offset function*/ + mpu_calc_offset(true, true); + + ESP_LOGW(TAG, "offset acc: %f, %f, %f", + mpu_get_acc_x_offset(), + mpu_get_acc_y_offset(), + mpu_get_acc_z_offset() + ); + + ESP_LOGW(TAG, "offset gyro: %f, %f, %f", + mpu_get_gyro_x_offset(), + mpu_get_gyro_y_offset(), + mpu_get_gyro_z_offset() + ); } else { ESP_LOGW(TAG, "Setting offsets"); - // mpu.setAccOffsets(CALIB_ACC_X, CALIB_ACC_Y, CALIB_ACC_Z); - // mpu.setGyroOffsets(CALIB_GYRO_X, CALIB_GYRO_Y, CALIB_GYRO_Z); - } - - // log_d("offset acc: %f, %f, %f", - // mpu.getAccXoffset(), - // mpu.getAccYoffset(), - // mpu.getAccZoffset()); + mpu_set_acc_offset(CALIB_ACC_X, CALIB_ACC_Y, CALIB_ACC_Z); + mpu_set_gyro_offset(CALIB_GYRO_X, CALIB_GYRO_Y, CALIB_GYRO_Z); - // log_d("offset gyro: %f, %f, %f", - // mpu.getGyroXoffset(), - // mpu.getGyroYoffset(), - // mpu.getGyroZoffset()); + mpu_set_angle_offset(0, 50, 0); + } /*-----update timer-----*/ timer_send_ms = esp_log_timestamp(); @@ -82,7 +88,7 @@ void task_rollover(void *arg){ timer_send_ms += send_rate_ms; // correct the assembly mounting - tilt_x.value = mpu_get_angle_x(); + tilt_x.value = -1*mpu_get_angle_x(); tilt_y.value = -1*mpu_get_angle_y(); tilt_z.value = mpu_get_angle_z(); temp.value = mpu_get_temp(); diff --git a/components/speedometer/CMakeLists.txt b/components/speedometer/CMakeLists.txt new file mode 100644 index 0000000..572ecb8 --- /dev/null +++ b/components/speedometer/CMakeLists.txt @@ -0,0 +1,5 @@ +idf_component_register( + SRCS "src/speedometer.c" + INCLUDE_DIRS "include" + REQUIRES system driver +) \ No newline at end of file diff --git a/components/speedometer/idf_component.yml b/components/speedometer/idf_component.yml new file mode 100644 index 0000000..64753fe --- /dev/null +++ b/components/speedometer/idf_component.yml @@ -0,0 +1,3 @@ +version: "1.0.0" +description: "speedometer" +url: "https://github.com/Parahybaja/firmware" \ No newline at end of file diff --git a/components/speedometer/include/task/speedometer.h b/components/speedometer/include/task/speedometer.h new file mode 100644 index 0000000..be675f4 --- /dev/null +++ b/components/speedometer/include/task/speedometer.h @@ -0,0 +1,48 @@ +/** + * @file alive.h + * @authors + * Jefferson Lopes (jefferson.lopes@ee.ufcg.edu.br) + * @brief calculate speed + * @version 1.0 + * @date 2024-03-08 + * + * @copyright Copyright (c) 2023 + * + * Version Modified By Date Comments + * ------- ------------- ---------- ----------- + * 0.3.0 Jefferson L. 26/10/2023 fix speed calculation + * 1.0.0 Jefferson L. 08/03/2024 idf convertion + * + */ + +#pragma once + +#include "system.h" +#include "driver/gpio.h" +#include "driver/pulse_cnt.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define TASK_SPEED_SEND_RATE_Hz 2 // speedometer task send rate in hertz + +#define PCNT_HIGH_LIMIT 10000 +#define PCNT_LOW_LIMIT -10 + +// ----- constants ----- +#define PI 3.1415f +#define ms2kmh 3.6f +#define WHEEL_DIA 0.56f // diameter in meters +#define WHEEL_CIRC (PI * WHEEL_DIA) // wheel circumference +#define WHEEL_EDGES 6.0f // 6 edges per revolution + +/** + * @brief keep blinking a LED to ensure the CPU is working properly + * + */ +void task_speed(void*); + +#ifdef __cplusplus +} +#endif diff --git a/components/speedometer/src/speedometer.c b/components/speedometer/src/speedometer.c new file mode 100644 index 0000000..2ac041e --- /dev/null +++ b/components/speedometer/src/speedometer.c @@ -0,0 +1,86 @@ +#include "task/speedometer.h" + +static const char *TAG = "speedometer"; + +void task_speed(void *arg){ + (void)arg; + + const gpio_num_t gpio_pin = (gpio_num_t)arg; + + // create task variables + const int send_rate_ms = (int)(1000.0 / (float)(TASK_SPEED_SEND_RATE_Hz)); + const float send_rate_s = 1.0f / (float)TASK_SPEED_SEND_RATE_Hz; + uint32_t timer_send_ms; + int pulse_count = 0; + sensor_t spdmt = { + .type = SPEEDOMETER, + .value = 0.0 + }; + + /*-----config pulse counter-----*/ + ESP_LOGI(TAG, "install pcnt unit"); + pcnt_unit_config_t unit_config = { + .high_limit = PCNT_HIGH_LIMIT, + .low_limit = PCNT_LOW_LIMIT, + }; + + pcnt_unit_handle_t pcnt_unit = NULL; + ESP_ERROR_CHECK(pcnt_new_unit(&unit_config, &pcnt_unit)); + + ESP_LOGI(TAG, "set glitch filter"); + pcnt_glitch_filter_config_t filter_config = { + .max_glitch_ns = 100, + }; + ESP_ERROR_CHECK(pcnt_unit_set_glitch_filter(pcnt_unit, &filter_config)); + + pcnt_chan_config_t chan_config = { + .edge_gpio_num = gpio_pin, + .level_gpio_num = -1, + .flags.virt_level_io_level = false, + }; + pcnt_channel_handle_t pcnt_chan = NULL; + ESP_ERROR_CHECK(pcnt_new_channel(pcnt_unit, &chan_config, &pcnt_chan)); + + ESP_ERROR_CHECK(pcnt_channel_set_edge_action(pcnt_chan, PCNT_CHANNEL_EDGE_ACTION_INCREASE, PCNT_CHANNEL_EDGE_ACTION_INCREASE)); + + ESP_LOGI(TAG, "enable pcnt unit"); + ESP_ERROR_CHECK(pcnt_unit_enable(pcnt_unit)); + ESP_LOGI(TAG, "clear pcnt unit"); + ESP_ERROR_CHECK(pcnt_unit_clear_count(pcnt_unit)); + ESP_LOGI(TAG, "start pcnt unit"); + ESP_ERROR_CHECK(pcnt_unit_start(pcnt_unit)); + + // show remaining task space + print_task_remaining_space(); + + // -----update timer----- + timer_send_ms = esp_log_timestamp(); + + for (;;) { + if ((esp_log_timestamp() - timer_send_ms) >= send_rate_ms){ + // -----add to timer----- + timer_send_ms += send_rate_ms; + + // -----get counts----- + esp_err_t err = pcnt_unit_get_count(pcnt_unit, &pulse_count); + pcnt_unit_clear_count(pcnt_unit); + + if (err == ESP_OK) { + // -----calculate----- + float meters = (pulse_count / WHEEL_EDGES) * WHEEL_CIRC; + spdmt.value = meters / send_rate_s; // in meter/second + spdmt.value *= ms2kmh; + + ESP_LOGW(TAG, "speed: %f, counts: %i", spdmt.value, pulse_count); + + // -----send spped data through esp-now to receiver----- + esp_now_send(mac_address_ECU_front, (uint8_t *) &spdmt, sizeof(spdmt)); + } + else { + ESP_LOGE(TAG, "error getting PCNT value"); + } + } + + vTaskDelay(pdMS_TO_TICKS(10)); // free up the processor + } +} diff --git a/components/system/CMakeLists.txt b/components/system/CMakeLists.txt index ac08338..8f49b76 100644 --- a/components/system/CMakeLists.txt +++ b/components/system/CMakeLists.txt @@ -1,5 +1,5 @@ idf_component_register( SRCS "src/system.c" INCLUDE_DIRS "include" - REQUIRES lora freertos esp_wifi esp_netif nvs_flash + REQUIRES lora freertos esp_wifi esp_netif nvs_flash esp_timer ) \ No newline at end of file diff --git a/components/system/include/system.h b/components/system/include/system.h index 474b47c..539cba8 100644 --- a/components/system/include/system.h +++ b/components/system/include/system.h @@ -31,6 +31,7 @@ #include "esp_mac.h" #include "esp_netif.h" #include "esp_now.h" +#include "esp_timer.h" #include "lora.h" #ifdef __cplusplus @@ -50,13 +51,20 @@ typedef enum { FUEL_LEVEL, FUEL_EMERGENCY, BATTERY, + HOURS, + MINUTES, + SECONDS, AMBIENT_TEMP, ROLLOVER, TILT_X, TILT_Y, TILT_Z, BLIND_SPOT_L, - BLIND_SPOT_R + BLIND_SPOT_R, + INFRARED, + LAP_MINUTES, + LAP_SECONDS, + LAP } sensor_type_t; typedef struct { @@ -65,6 +73,9 @@ typedef struct { float fuel_level; float fuel_em; float battery; + int hours; + int minutes; + int seconds; float temp; float rollover; float tilt_x; @@ -72,6 +83,10 @@ typedef struct { float tilt_z; float blind_spot_l; float blind_spot_r; + float infrared; + int lap_minutes; + int lap_seconds; + int lap; } system_t; typedef struct { @@ -81,6 +96,9 @@ typedef struct { uint8_t fuel_level; // For fuel level, precision to the nearest percentage uint8_t fuel_em; uint8_t battery; // For battery, precision to the nearest percentage + uint8_t hours; + uint8_t minutes; + uint8_t seconds; int8_t temp; // For temperature, precision to the nearest degree uint8_t rollover; // For rollover, 0 or 1 int8_t tilt_x; // For tilt, precision to the nearest degree @@ -88,6 +106,10 @@ typedef struct { int8_t tilt_z; // For tilt, precision to the nearest degree uint8_t blind_spot_l; // For blind spot left, 0 or 1 uint8_t blind_spot_r; // For blind spot right, 0 or 1 + uint8_t infrared; + uint8_t lap; // For monitoring to 4x4 0 or 1 + uint8_t lap_minutes; + uint8_t lap_seconds; } simplified_system_t; // -----sensor data type definition----- @@ -108,10 +130,12 @@ extern TaskHandle_t th_fuel_em; extern TaskHandle_t th_speed; extern TaskHandle_t th_rollover; extern TaskHandle_t th_battery; +extern TaskHandle_t th_timer; extern TaskHandle_t th_blind_spot; extern TaskHandle_t th_display_nextion; extern TaskHandle_t th_display_LCD; extern TaskHandle_t th_telemetry; +extern TaskHandle_t th_infrared; extern SemaphoreHandle_t sh_global_vars; extern QueueHandle_t qh_rpm; extern QueueHandle_t qh_speed; @@ -120,9 +144,17 @@ extern QueueHandle_t qh_fuel_emer; extern QueueHandle_t qh_battery; extern QueueHandle_t qh_temp; extern QueueHandle_t qh_rollover; +extern QueueHandle_t qh_hours; +extern QueueHandle_t qh_minutes; +extern QueueHandle_t qh_seconds; extern QueueHandle_t qh_tilt_x; extern QueueHandle_t qh_tilt_y; extern QueueHandle_t qh_tilt_z; +extern QueueHandle_t qh_infrared; +extern QueueHandle_t qh_lap; +extern QueueHandle_t qh_lap_minutes; +extern QueueHandle_t qh_lap_seconds; + // -----esp-now mac addresses----- extern const uint8_t mac_address_ECU_box[ESP_NOW_ETH_ALEN]; diff --git a/components/system/src/system.c b/components/system/src/system.c index b4794ed..5c69271 100644 --- a/components/system/src/system.c +++ b/components/system/src/system.c @@ -14,7 +14,8 @@ system_t system_global = { .tilt_y = 0.0, .tilt_z = 0.0, .blind_spot_l = 0.0, - .blind_spot_r = 0.0 + .blind_spot_r = 0.0, + .infrared = 0.0 }; // -----FreeRTOS objects----- @@ -26,25 +27,34 @@ TaskHandle_t th_fuel_em; TaskHandle_t th_speed; TaskHandle_t th_rollover; TaskHandle_t th_battery; +TaskHandle_t th_timer; TaskHandle_t th_blind_spot; TaskHandle_t th_display_nextion; TaskHandle_t th_display_LCD; TaskHandle_t th_telemetry; +TaskHandle_t th_infrared; SemaphoreHandle_t sh_global_vars; QueueHandle_t qh_rpm; QueueHandle_t qh_speed; QueueHandle_t qh_fuel_level; QueueHandle_t qh_fuel_emer; QueueHandle_t qh_battery; +QueueHandle_t qh_hours; +QueueHandle_t qh_minutes; +QueueHandle_t qh_seconds; QueueHandle_t qh_temp; QueueHandle_t qh_rollover; QueueHandle_t qh_tilt_x; QueueHandle_t qh_tilt_y; QueueHandle_t qh_tilt_z; +QueueHandle_t qh_infrared; +QueueHandle_t qh_lap; +QueueHandle_t qh_lap_minutes; +QueueHandle_t qh_lap_seconds; // -----esp-now addresses----- const uint8_t mac_address_TCU[] = {0xC8, 0xF0, 0x9E, 0x31, 0x8C, 0xA0}; -const uint8_t mac_address_ECU_front[] = {0xC8, 0xF0, 0x9E, 0x31, 0x87, 0xB9}; +const uint8_t mac_address_ECU_front[] = {0xC8, 0xF0, 0x9E, 0x31, 0x87, 0xB8}; const uint8_t mac_address_ECU_rear[] = {0xC8, 0xF0, 0x9E, 0x31, 0x8D, 0xBD}; const uint8_t mac_address_module_1[] = {0xC8, 0xF0, 0x9E, 0x31, 0x8D, 0x38}; const uint8_t mac_address_module_2[] = {0xC8, 0xF0, 0x9E, 0x31, 0x8A, 0xD8}; @@ -89,7 +99,8 @@ simplified_system_t system_to_simplified(const system_t *original) { .tilt_y = (int8_t)original->tilt_y, .tilt_z = (int8_t)original->tilt_z, .blind_spot_l = (original->blind_spot_l != 0), - .blind_spot_r = (original->blind_spot_r != 0) + .blind_spot_r = (original->blind_spot_r != 0), + .infrared = (uint8_t)original->infrared }; return simplified; @@ -108,7 +119,8 @@ system_t simplified_to_system(const simplified_system_t *simplified) { .tilt_y = (float) simplified->tilt_y, .tilt_z = (float) simplified->tilt_z, .blind_spot_l = (float)(simplified->blind_spot_l ? 1 : 0), // Assuming binary 0 or 1 represents the boolean - .blind_spot_r = (float)(simplified->blind_spot_r ? 1 : 0) // Assuming binary 0 or 1 represents the boolean + .blind_spot_r = (float)(simplified->blind_spot_r ? 1 : 0), // Assuming binary 0 or 1 represents the boolean + .infrared = (uint8_t)(simplified->infrared? 1 : 0) }; return original; @@ -125,10 +137,16 @@ void system_queue_init(void) { qh_rpm = xQueueCreate(QUEUE_BUFFER_SIZE, sizeof(sensor_t)); qh_fuel_emer = xQueueCreate(QUEUE_BUFFER_SIZE, sizeof(sensor_t)); qh_battery = xQueueCreate(QUEUE_BUFFER_SIZE, sizeof(sensor_t)); + qh_hours = xQueueCreate(QUEUE_BUFFER_SIZE, sizeof(sensor_t)); + qh_minutes = xQueueCreate(QUEUE_BUFFER_SIZE, sizeof(sensor_t)); + qh_seconds = xQueueCreate(QUEUE_BUFFER_SIZE, sizeof(sensor_t)); qh_temp = xQueueCreate(QUEUE_BUFFER_SIZE, sizeof(sensor_t)); qh_tilt_x = xQueueCreate(QUEUE_BUFFER_SIZE, sizeof(sensor_t)); qh_tilt_y = xQueueCreate(QUEUE_BUFFER_SIZE, sizeof(sensor_t)); qh_rollover = xQueueCreate(QUEUE_BUFFER_SIZE, sizeof(sensor_t)); + qh_infrared = xQueueCreate(QUEUE_BUFFER_SIZE, sizeof(sensor_t)); + qh_lap_minutes = xQueueCreate(QUEUE_BUFFER_SIZE, sizeof(sensor_t)); + qh_lap_seconds = xQueueCreate(QUEUE_BUFFER_SIZE, sizeof(sensor_t)); } void system_espnow_init(void) { @@ -312,7 +330,7 @@ void task_lora_receiver(void *arg) { /*prepare payload message*/ int len = snprintf( payload, sizeof(payload), - "DATA:%d,%d,%d,%.2f,%.2f,%d,%.2f,%.2f,%.2f", + "DATA:%d,%d,%d,%.2f,%.2f,%d,%.2f,%.2f,%.2f,%d", (uint16_t)converted_system.rpm, (uint8_t)converted_system.speed, (uint8_t)converted_system.fuel_em, @@ -321,7 +339,8 @@ void task_lora_receiver(void *arg) { (uint8_t)converted_system.rollover, (float)converted_system.tilt_x, (float)converted_system.tilt_y, - (float)converted_system.tilt_z + (float)converted_system.tilt_z, + (uint8_t)converted_system.infrared ); /*send payload to server*/ diff --git a/components/timer/CMakeLists.txt b/components/timer/CMakeLists.txt new file mode 100644 index 0000000..ea3f4bd --- /dev/null +++ b/components/timer/CMakeLists.txt @@ -0,0 +1,5 @@ +idf_component_register( + SRCS "src/timer.c" + INCLUDE_DIRS "include" + REQUIRES system +) \ No newline at end of file diff --git a/components/timer/idf_component.yml b/components/timer/idf_component.yml new file mode 100644 index 0000000..5c83b0b --- /dev/null +++ b/components/timer/idf_component.yml @@ -0,0 +1,3 @@ +version: "0.1.0" +description: "timer" +url: "https://github.com/Parahybaja/firmware" \ No newline at end of file diff --git a/components/timer/include/task/timer.h b/components/timer/include/task/timer.h new file mode 100644 index 0000000..4d0c037 --- /dev/null +++ b/components/timer/include/task/timer.h @@ -0,0 +1,29 @@ +/** + * @file timer.h + * @authors + * Luiz Guilherme (luizoliver2005@gmail.com) + * @brief timer task + * @version 0.1 + * @date 2024/09/23 + * + * @copyright Copyright (c) 2024 + * + * Version Modified By Date Comments + * ------- ------------- ---------- ----------- + * 0.1.0 Luiz Gui. 23/09/2023 first version + * + */ + +#pragma once + +#include "system.h" + +#ifdef __cplusplus +extern "C" { +#endif + +void task_timer(void*); + +#ifdef __cplusplus +} +#endif \ No newline at end of file diff --git a/components/timer/src/timer.c b/components/timer/src/timer.c new file mode 100644 index 0000000..83058a4 --- /dev/null +++ b/components/timer/src/timer.c @@ -0,0 +1,42 @@ +#include "task/timer.h" + +static const char *TAG = "timer"; + +void task_timer(void *arg){ + float start_time = esp_timer_get_time()/1000000; + + sensor_t hours = { + .type = HOURS, + .value = 0.0 + }; + + sensor_t minutes = { + .type = MINUTES, + .value = 0.0 + }; + + sensor_t seconds = { + .type = SECONDS, + .value = 0.0 + }; + + + for (;;) { + float current_time = esp_timer_get_time()/1000000; + + int time = (int) (current_time - start_time); + int remaining_time = (4 * 60 * 60) - time; + + hours.value = (float) (remaining_time / 3600); + minutes.value = (remaining_time / 60) - (hours.value * 60); + seconds.value = remaining_time - (minutes.value * 60) - (hours.value * 3600); + + xQueueSend(qh_hours, &hours, pdMS_TO_TICKS(0)); + xQueueSend(qh_minutes, &minutes, pdMS_TO_TICKS(0)); + xQueueSend(qh_seconds, &seconds, pdMS_TO_TICKS(0)); + + ESP_LOGI(TAG, "send timer, hours: %f, minutes: %f, seconds: %f", hours.value, minutes.value, seconds.value); + + vTaskDelay(pdMS_TO_TICKS(1000)); // free up the processor + } +}