diff --git a/.github/workflows/Arduino-Lint-Check.yml b/.github/workflows/Arduino-Lint-Check.yml index ee49e2f830..c58faf741e 100644 --- a/.github/workflows/Arduino-Lint-Check.yml +++ b/.github/workflows/Arduino-Lint-Check.yml @@ -1,17 +1,18 @@ name: Arduino Lint Check on: push: - branches: [ master ] + branches: [main, master] pull_request: - branches: [ master ] + branches: [main, master] + workflow_dispatch: jobs: lint: name: Lint Check runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - uses: arduino/arduino-lint-action@v1 + - uses: actions/checkout@v4 + - uses: arduino/arduino-lint-action@v2 with: library-manager: update compliance: strict - project-type: all \ No newline at end of file + project-type: all diff --git a/.github/workflows/clang-format-check.yml b/.github/workflows/clang-format-check.yml index 1d8a20c2f9..4cfdca1d9a 100644 --- a/.github/workflows/clang-format-check.yml +++ b/.github/workflows/clang-format-check.yml @@ -8,14 +8,13 @@ jobs: matrix: path: - check: './' # path to include - exclude: './lib' # path to exclude - exclude: './include' # path to exclude + exclude: '(^|[\\/])(lib|include)([\\/]|$)' # paths to exclude # - check: 'src' # exclude: '(Fonts)' # Exclude file paths containing "Fonts" # - check: 'examples' # exclude: '' steps: - - uses: actions/checkout@v3.1.0 + - uses: actions/checkout@v4 - name: Run clang-format style check for C/C++/Protobuf programs. uses: jidicula/clang-format-action@v4.9.0 with: diff --git a/.github/workflows/platformio.yml b/.github/workflows/platformio.yml index a4f7c3ca51..759d40afb9 100644 --- a/.github/workflows/platformio.yml +++ b/.github/workflows/platformio.yml @@ -1,24 +1,37 @@ -name: Build test with platformio +name: Build test with PlatformIO -on: [push, pull_request] +on: + push: + pull_request: + workflow_dispatch: jobs: build: + name: Build (${{ matrix.environment }}) runs-on: ubuntu-latest - + timeout-minutes: 30 + strategy: + fail-fast: false + matrix: + environment: + - esp32-s3-devkitc-1 + - esp32-s3-devkitc-1-arduino3311 + steps: - - uses: actions/checkout@v3 - - uses: actions/cache@v3 + - uses: actions/checkout@v4 + - uses: actions/cache@v4 with: path: | ~/.cache/pip ~/.platformio/.cache - key: ${{ runner.os }}-pio - - uses: actions/setup-python@v4 + key: ${{ runner.os }}-pio-${{ matrix.environment }}-${{ hashFiles('platformio.ini') }} + restore-keys: | + ${{ runner.os }}-pio-${{ matrix.environment }}- + - uses: actions/setup-python@v5 with: python-version: '3.11' - name: Install PlatformIO Core - run: pip install --upgrade platformio + run: pip install platformio==6.1.19 - name: Build PlatformIO Project - run: pio run + run: pio run -e ${{ matrix.environment }} diff --git a/include/arduino_esp32_compat.h b/include/arduino_esp32_compat.h new file mode 100755 index 0000000000..f1fcdb218c --- /dev/null +++ b/include/arduino_esp32_compat.h @@ -0,0 +1,53 @@ +#pragma once + +#include +#include +#include + +#if ESP_ARDUINO_VERSION >= ESP_ARDUINO_VERSION_VAL(3, 0, 0) +#define STAMPFLY_ARDUINO_ESP32_V3 1 +#define STAMPFLY_ARDUINO_ESP32_BRANCH_NAME "3.x compatibility branch" +#else +#define STAMPFLY_ARDUINO_ESP32_V3 0 +#define STAMPFLY_ARDUINO_ESP32_BRANCH_NAME "legacy compatibility branch" +#endif + +#define STAMPFLY_STRINGIFY_IMPL(value) #value +#define STAMPFLY_STRINGIFY(value) STAMPFLY_STRINGIFY_IMPL(value) +#define STAMPFLY_ARDUINO_ESP32_VERSION_STRING \ + STAMPFLY_STRINGIFY(ESP_ARDUINO_VERSION_MAJOR) "." \ + STAMPFLY_STRINGIFY(ESP_ARDUINO_VERSION_MINOR) "." \ + STAMPFLY_STRINGIFY(ESP_ARDUINO_VERSION_PATCH) + +#if STAMPFLY_ARDUINO_ESP32_V3 +#include + +static inline void stampfly_delay_us(uint32_t us) +{ + esp_rom_delay_us(us); +} +#else +#include + +static inline void stampfly_delay_us(uint32_t us) +{ + ets_delay_us(us); +} +#endif +#ifdef __cplusplus +#if STAMPFLY_ARDUINO_ESP32_V3 + +#if !defined(ARDUINO_USB_MODE) || !ARDUINO_USB_MODE +#error "StampFly HWCDC compatibility requires ARDUINO_USB_MODE=1" +#endif + +#if !defined(ARDUINO_USB_CDC_ON_BOOT) || !ARDUINO_USB_CDC_ON_BOOT +#error "StampFly HWCDC compatibility requires ARDUINO_USB_CDC_ON_BOOT=1" +#endif + +#include + +#define USBSerial HWCDCSerial + +#endif +#endif diff --git a/include/arduino_esp32_i2c_compat.h b/include/arduino_esp32_i2c_compat.h new file mode 100755 index 0000000000..49c7e926d2 --- /dev/null +++ b/include/arduino_esp32_i2c_compat.h @@ -0,0 +1,27 @@ +#pragma once + +#include +#include + +#include "arduino_esp32_compat.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#if STAMPFLY_ARDUINO_ESP32_V3 + +int stampfly_i2c_write(uint8_t i2c_num, uint16_t address, const uint8_t *data, size_t length); +int stampfly_i2c_read(uint8_t i2c_num, uint16_t address, uint8_t *data, size_t length); +int stampfly_i2c_write_read(uint8_t i2c_num, + uint16_t address, + const uint8_t *write_data, + size_t write_length, + uint8_t *read_data, + size_t read_length); + +#endif + +#ifdef __cplusplus +} +#endif diff --git a/lib/bmi270/common.c b/lib/bmi270/common.c index 94352c66c8..21bd579b77 100644 --- a/lib/bmi270/common.c +++ b/lib/bmi270/common.c @@ -10,6 +10,7 @@ #include #include "common.h" +#include "../../include/arduino_esp32_i2c_compat.h" //#include "bmi2_defs.h" //#include "driver/i2c.h" @@ -39,18 +40,22 @@ static struct coines_intf_config intf_conf; struct bmi2_dev Bmi270; struct bmi2_dev *pBmi270=&Bmi270; -i2c_cmd_handle_t i2chandle; +#if !STAMPFLY_ARDUINO_ESP32_V3 +static i2c_cmd_handle_t i2chandle; +#endif // SPIデバイスハンドラーを使って通信する spi_device_handle_t spidev; +#if !STAMPFLY_ARDUINO_ESP32_V3 i2c_port_t i2c_port=1; +#endif uint8_t Bmi270_address = 0x69; -uint8_t _I2CBuffer[256]; +static uint8_t _I2CBuffer[256]; struct bmi2_sens_config config; @@ -65,6 +70,7 @@ void bmi270_dev_init(void) Bmi270.gyro_en = 1; } +#if !STAMPFLY_ARDUINO_ESP32_V3 void getI2cBus(void) { i2chandle = i2c_cmd_link_create(); @@ -98,6 +104,7 @@ int _i2cRead(uint8_t slave_address, uint8_t *pdata, uint32_t count) { status = i2c_master_read_byte(i2chandle, pdata+count-1, I2C_MASTER_NACK); return status; } +#endif /******************************************************************************/ /*! User interface functions */ @@ -111,6 +118,13 @@ BMI2_INTF_RETURN_TYPE bmi2_i2c_read(uint8_t reg_addr, uint8_t *reg_data, uint32_ int32_t status_int; _I2CBuffer[0] = reg_addr; +#if STAMPFLY_ARDUINO_ESP32_V3 + status_int = stampfly_i2c_write_read(1, Bmi270_address, _I2CBuffer, 1, reg_data, len); + if (status_int != 0) { + Status = 0x66; + } + return Status; +#else getI2cBus(); status_int = _i2cWrite(Bmi270_address, _I2CBuffer, 1); if (status_int != 0) { @@ -124,6 +138,7 @@ BMI2_INTF_RETURN_TYPE bmi2_i2c_read(uint8_t reg_addr, uint8_t *reg_data, uint32_ done: putI2cBus(); return Status; +#endif } /*! @@ -138,6 +153,13 @@ BMI2_INTF_RETURN_TYPE bmi2_i2c_write(uint8_t reg_addr, const uint8_t *reg_data, } _I2CBuffer[0] = reg_addr; memcpy(&_I2CBuffer[1], reg_data, len); +#if STAMPFLY_ARDUINO_ESP32_V3 + status_int = stampfly_i2c_write(1, Bmi270_address, _I2CBuffer, len + 1); + if (status_int != 0) { + Status = 0x55; + } + return Status; +#else getI2cBus(); status_int = _i2cWrite(Bmi270_address, _I2CBuffer, len + 1); if (status_int != 0) { @@ -145,6 +167,7 @@ BMI2_INTF_RETURN_TYPE bmi2_i2c_write(uint8_t reg_addr, const uint8_t *reg_data, } putI2cBus(); return Status; +#endif } //SPIバスの設定 @@ -256,7 +279,7 @@ BMI2_INTF_RETURN_TYPE bmi2_spi_write(uint8_t reg_addr, const uint8_t *reg_data, void bmi2_delay_us(uint32_t period, void *intf_ptr) { //coines_delay_usec(period); - ets_delay_us(period); + stampfly_delay_us(period); } /*! diff --git a/lib/bmi270/common.h b/lib/bmi270/common.h index 4719e2a4fd..267be43bca 100644 --- a/lib/bmi270/common.h +++ b/lib/bmi270/common.h @@ -17,7 +17,10 @@ extern "C" { #include #include "bmi2.h" #include "bmi2_defs.h" +#include "../../include/arduino_esp32_i2c_compat.h" +#if !STAMPFLY_ARDUINO_ESP32_V3 #include "driver/i2c.h" +#endif #include #include "driver/gpio.h" #include "sdkconfig.h" diff --git a/lib/vl53l3c/vl53lx_platform.c b/lib/vl53l3c/vl53lx_platform.c index 495cfe05d7..21831a48fe 100644 --- a/lib/vl53l3c/vl53lx_platform.c +++ b/lib/vl53l3c/vl53lx_platform.c @@ -38,6 +38,7 @@ unsigned int i2cwriteCount = 0; unsigned char SPI2C_Buffer[256]; #include +#include "../../include/arduino_esp32_i2c_compat.h" #ifndef SMALL_FOOTPRINT #include #endif @@ -49,7 +50,9 @@ unsigned char SPI2C_Buffer[256]; #include //#include "esp_log.h" +#if !STAMPFLY_ARDUINO_ESP32_V3 #include "driver/i2c.h" +#endif #define I2C_TIME_OUT_BASE 10 #define I2C_TIME_OUT_BYTE 1 @@ -60,7 +63,20 @@ unsigned char SPI2C_Buffer[256]; #endif -i2c_cmd_handle_t i2chandle; +#if STAMPFLY_ARDUINO_ESP32_V3 +typedef struct { + uint8_t address; + const uint8_t *write_data; + uint32_t write_count; + uint8_t *read_data; + uint32_t read_count; + int transfer_status; +} stampfly_i2c_transaction_t; + +static stampfly_i2c_transaction_t i2c_transaction; +#else +static i2c_cmd_handle_t i2chandle; +#endif //#ifndef HAL_I2C_MODULE_ENABLED //#warning "HAL I2C module must be enable " @@ -70,7 +86,7 @@ i2c_cmd_handle_t i2chandle; -uint8_t _I2CBuffer[256]; +static uint8_t _I2CBuffer[256]; #define I2C_MASTER_SDA_IO 3 @@ -82,6 +98,7 @@ uint8_t _I2CBuffer[256]; #define I2C_MASTER_TIMEOUT_MS 1000 //#define I2C_SENSOR_ADDR 0x29 +#if !STAMPFLY_ARDUINO_ESP32_V3 int i2c_master_port = I2C_MASTER_NUM; i2c_config_t conf = { .mode = I2C_MODE_MASTER, @@ -92,6 +109,7 @@ i2c_config_t conf = { .master.clk_speed = I2C_MASTER_FREQ_HZ, // select frequency specific to your project .clk_flags = 0, // optional; you can use I2C_SCLK_SRC_FLAG_* flags to choose i2c source clock here }; +#endif /* when not customized by application define dummy one */ //#ifndef VL53LX_GetI2cBus @@ -101,7 +119,16 @@ i2c_config_t conf = { //#endif void VL53LX_GetI2cBus(void) { +#if STAMPFLY_ARDUINO_ESP32_V3 + i2c_transaction.address = 0; + i2c_transaction.write_data = NULL; + i2c_transaction.write_count = 0; + i2c_transaction.read_data = NULL; + i2c_transaction.read_count = 0; + i2c_transaction.transfer_status = 0; +#else i2chandle = i2c_cmd_link_create(); +#endif } //#ifndef VL53LX_PutI2cBus @@ -112,16 +139,48 @@ void VL53LX_GetI2cBus(void) void VL53LX_PutI2cBus(void) { +#if STAMPFLY_ARDUINO_ESP32_V3 + if ((i2c_transaction.write_count != 0U) && (i2c_transaction.read_count != 0U)) { + i2c_transaction.transfer_status = stampfly_i2c_write_read(I2C_MASTER_NUM, + i2c_transaction.address, + i2c_transaction.write_data, + i2c_transaction.write_count, + i2c_transaction.read_data, + i2c_transaction.read_count); + } else if (i2c_transaction.write_count != 0U) { + i2c_transaction.transfer_status = stampfly_i2c_write(I2C_MASTER_NUM, + i2c_transaction.address, + i2c_transaction.write_data, + i2c_transaction.write_count); + } else if (i2c_transaction.read_count != 0U) { + i2c_transaction.transfer_status = stampfly_i2c_read(I2C_MASTER_NUM, + i2c_transaction.address, + i2c_transaction.read_data, + i2c_transaction.read_count); + } +#else i2c_master_stop(i2chandle); i2c_master_cmd_begin(i2c_master_port,i2chandle, 1 / portTICK_RATE_MS); i2c_cmd_link_delete(i2chandle); +#endif } +#if STAMPFLY_ARDUINO_ESP32_V3 +static VL53LX_Error stampfly_i2c_propagate_status(VL53LX_Error status) +{ + if ((status == VL53LX_ERROR_NONE) && (i2c_transaction.transfer_status != 0)) { + return VL53LX_ERROR_CONTROL_INTERFACE; + } + + return status; +} +#endif + int vl53lx_i2c_init(void) { int status=0; //i2c_driver_delete(i2c_master_port); - ets_delay_us(100000); + stampfly_delay_us(100000); //delay(100); //status = i2c_param_config(i2c_master_port, &conf); //status = status|i2c_driver_install(i2c_master_port, conf.mode, 0, 0, 0); @@ -129,15 +188,36 @@ int vl53lx_i2c_init(void) } int _I2CWrite(VL53LX_DEV Dev, uint8_t *pdata, uint32_t count) { +#if STAMPFLY_ARDUINO_ESP32_V3 + if ((Dev == NULL) || ((pdata == NULL) && (count != 0U))) { + return -1; + } + + i2c_transaction.address = Dev->i2c_slave_address; + i2c_transaction.write_data = pdata; + i2c_transaction.write_count = count; + return 0; +#else int status; i2c_master_start(i2chandle); status = i2c_master_write_byte(i2chandle, (Dev->i2c_slave_address<<1)|I2C_MASTER_WRITE, I2C_MASTER_ACK); status = i2c_master_write(i2chandle, pdata, count, I2C_MASTER_ACK); return status; +#endif } int _I2CRead(VL53LX_DEV Dev, uint8_t *pdata, uint32_t count) { +#if STAMPFLY_ARDUINO_ESP32_V3 + if ((Dev == NULL) || ((pdata == NULL) && (count != 0U))) { + return -1; + } + + i2c_transaction.address = Dev->i2c_slave_address; + i2c_transaction.read_data = pdata; + i2c_transaction.read_count = count; + return 0; +#else int status; i2c_master_start(i2chandle); @@ -148,6 +228,7 @@ int _I2CRead(VL53LX_DEV Dev, uint8_t *pdata, uint32_t count) { } status = i2c_master_read_byte(i2chandle, pdata+count-1, I2C_MASTER_NACK); return status; +#endif } VL53LX_Error VL53LX_WriteMulti(VL53LX_DEV Dev, uint16_t index, uint8_t *pdata, uint32_t count) { @@ -165,6 +246,9 @@ VL53LX_Error VL53LX_WriteMulti(VL53LX_DEV Dev, uint16_t index, uint8_t *pdata, u Status = VL53LX_ERROR_CONTROL_INTERFACE; } VL53LX_PutI2cBus(); +#if STAMPFLY_ARDUINO_ESP32_V3 + Status = stampfly_i2c_propagate_status(Status); +#endif return Status; } @@ -187,6 +271,9 @@ VL53LX_Error VL53LX_ReadMulti(VL53LX_DEV Dev, uint16_t index, uint8_t *pdata, ui } done: VL53LX_PutI2cBus(); +#if STAMPFLY_ARDUINO_ESP32_V3 + Status = stampfly_i2c_propagate_status(Status); +#endif return Status; } @@ -204,6 +291,9 @@ VL53LX_Error VL53LX_WrByte(VL53LX_DEV Dev, uint16_t index, uint8_t data) { Status = VL53LX_ERROR_CONTROL_INTERFACE; } VL53LX_PutI2cBus(); +#if STAMPFLY_ARDUINO_ESP32_V3 + Status = stampfly_i2c_propagate_status(Status); +#endif return Status; } @@ -222,6 +312,9 @@ VL53LX_Error VL53LX_WrWord(VL53LX_DEV Dev, uint16_t index, uint16_t data) { Status = VL53LX_ERROR_CONTROL_INTERFACE; } VL53LX_PutI2cBus(); +#if STAMPFLY_ARDUINO_ESP32_V3 + Status = stampfly_i2c_propagate_status(Status); +#endif return Status; } @@ -240,6 +333,9 @@ VL53LX_Error VL53LX_WrDWord(VL53LX_DEV Dev, uint16_t index, uint32_t data) { Status = VL53LX_ERROR_CONTROL_INTERFACE; } VL53LX_PutI2cBus(); +#if STAMPFLY_ARDUINO_ESP32_V3 + Status = stampfly_i2c_propagate_status(Status); +#endif return Status; } @@ -276,6 +372,9 @@ VL53LX_Error VL53LX_RdByte(VL53LX_DEV Dev, uint16_t index, uint8_t *data) { done: VL53LX_PutI2cBus(); +#if STAMPFLY_ARDUINO_ESP32_V3 + Status = stampfly_i2c_propagate_status(Status); +#endif return Status; } @@ -300,7 +399,14 @@ VL53LX_Error VL53LX_RdWord(VL53LX_DEV Dev, uint16_t index, uint16_t *data) { done: VL53LX_PutI2cBus(); +#if STAMPFLY_ARDUINO_ESP32_V3 + Status = stampfly_i2c_propagate_status(Status); + if (Status == VL53LX_ERROR_NONE) { + *data = ((uint16_t)_I2CBuffer[0]<<8)+ (uint16_t)_I2CBuffer[1]; + } +#else *data = ((uint16_t)_I2CBuffer[0]<<8)+ (uint16_t)_I2CBuffer[1]; +#endif return Status; } @@ -324,7 +430,14 @@ VL53LX_Error VL53LX_RdDWord(VL53LX_DEV Dev, uint16_t index, uint32_t *data) { done: VL53LX_PutI2cBus(); +#if STAMPFLY_ARDUINO_ESP32_V3 + Status = stampfly_i2c_propagate_status(Status); + if (Status == VL53LX_ERROR_NONE) { + *data = ((uint32_t)_I2CBuffer[0]<<24) + ((uint32_t)_I2CBuffer[1]<<16) + ((uint32_t)_I2CBuffer[2]<<8) + (uint32_t)_I2CBuffer[3]; + } +#else *data = ((uint32_t)_I2CBuffer[0]<<24) + ((uint32_t)_I2CBuffer[1]<<16) + ((uint32_t)_I2CBuffer[2]<<8) + (uint32_t)_I2CBuffer[3]; +#endif return Status; } @@ -392,14 +505,14 @@ VL53LX_Error VL53LX_GetTimerFrequency(int32_t *ptimer_freq_hz) VL53LX_Error VL53LX_WaitMs(VL53LX_Dev_t *pdev, int32_t wait_ms){ (void)pdev; - ets_delay_us(wait_ms*1000); + stampfly_delay_us(wait_ms*1000); //delay(wait_ms); return VL53LX_ERROR_NONE; } VL53LX_Error VL53LX_WaitUs(VL53LX_Dev_t *pdev, int32_t wait_us){ (void)pdev; - ets_delay_us(wait_us); + stampfly_delay_us(wait_us); //delay(wait_us/1000); return VL53LX_ERROR_NONE; } @@ -507,4 +620,3 @@ VL53LX_Error VL53LX_WaitValueMaskEx( - diff --git a/platformio.ini b/platformio.ini index 0a4bf8ceaa..023f89ef4f 100644 --- a/platformio.ini +++ b/platformio.ini @@ -8,22 +8,38 @@ ; Please visit documentation for the other options and examples ; https://docs.platformio.org/page/projectconf.html +[platformio] +default_envs = esp32-s3-devkitc-1 + [env] -platform = espressif32 board = esp32-s3-devkitc-1 framework = arduino monitor_speed = 115200 -lib_deps = - fastled/FastLED - tinyu-zhao/INA3221 - mathertel/OneButton @ ^2.5.0 -[env:esp32-s3-devkitc-1] +lib_deps = + fastled/FastLED @ 3.10.3 + tinyu-zhao/INA3221 @ 0.0.1 + mathertel/OneButton @ 2.6.2 + build_type = release -build_flags = -DCORE_DEBUG_LEVEL=0 -O0 +build_flags = + -DCORE_DEBUG_LEVEL=0 + -O0 + extra_scripts = post:generate_user_custom.py + custom_firmware_version = 0.0.1 -custom_firmware_name = stampfly_firmware custom_firmware_suffix = .bin custom_firmware_dir = ./ - \ No newline at end of file + +[env:esp32-s3-devkitc-1] +platform = espressif32 @ 7.0.1 +custom_firmware_name = stampfly_firmware + + +[env:esp32-s3-devkitc-1-arduino3311] +platform = https://github.com/pioarduino/platform-espressif32/releases/download/55.03.311/platform-espressif32.zip +build_flags = + ${env.build_flags} + -DARDUINO_USB_CDC_ON_BOOT=1 +custom_firmware_name = stampfly_firmware3311 \ No newline at end of file diff --git a/src/arduino_esp32_i2c_compat.c b/src/arduino_esp32_i2c_compat.c new file mode 100755 index 0000000000..9433c21eca --- /dev/null +++ b/src/arduino_esp32_i2c_compat.c @@ -0,0 +1,62 @@ +#include "arduino_esp32_i2c_compat.h" + +#if STAMPFLY_ARDUINO_ESP32_V3 + +#include +#include + +#define STAMPFLY_I2C_TIMEOUT_MS 50U + +int stampfly_i2c_write(uint8_t i2c_num, uint16_t address, const uint8_t *data, size_t length) +{ + if ((data == NULL) && (length != 0U)) { + return -1; + } + + return i2cWrite(i2c_num, address, data, length, STAMPFLY_I2C_TIMEOUT_MS) == ESP_OK ? 0 : -1; +} + +int stampfly_i2c_read(uint8_t i2c_num, uint16_t address, uint8_t *data, size_t length) +{ + size_t read_count = 0; + + if ((data == NULL) && (length != 0U)) { + return -1; + } + + if (i2cRead(i2c_num, address, data, length, STAMPFLY_I2C_TIMEOUT_MS, &read_count) != ESP_OK) { + return -1; + } + + return read_count == length ? 0 : -1; +} + +int stampfly_i2c_write_read(uint8_t i2c_num, + uint16_t address, + const uint8_t *write_data, + size_t write_length, + uint8_t *read_data, + size_t read_length) +{ + size_t read_count = 0; + + if (((write_data == NULL) && (write_length != 0U)) || + ((read_data == NULL) && (read_length != 0U))) { + return -1; + } + + if (i2cWriteReadNonStop(i2c_num, + address, + write_data, + write_length, + read_data, + read_length, + STAMPFLY_I2C_TIMEOUT_MS, + &read_count) != ESP_OK) { + return -1; + } + + return read_count == read_length ? 0 : -1; +} + +#endif diff --git a/src/buzzer.cpp b/src/buzzer.cpp index 478f06fcb7..b0eb10d6a5 100644 --- a/src/buzzer.cpp +++ b/src/buzzer.cpp @@ -6,23 +6,37 @@ #include "Arduino.h" #include #include "buzzer.h" +#include "arduino_esp32_compat.h" const int buzzerPin = 40; const int channel = 5; void setup_pwm_buzzer(void) { +#if STAMPFLY_ARDUINO_ESP32_V3 + ledcAttachChannel(buzzerPin, 4000, 8, channel); +#else ledcSetup(channel, 4000, 8); // 配置PWM通道:通道0,频率3000Hz,分辨率8位 ledcAttachPin(buzzerPin, channel); // 将PWM通道绑定到GPIO +#endif } void buzzer_sound(uint32_t frequency, uint32_t duration_ms) { +#if STAMPFLY_ARDUINO_ESP32_V3 + ledcWriteTone(buzzerPin, frequency); + ledcWrite(buzzerPin, 127); +#else ledcWriteTone(channel, frequency); ledcWrite(channel, 127); +#endif vTaskDelay(duration_ms / portTICK_PERIOD_MS); +#if STAMPFLY_ARDUINO_ESP32_V3 + ledcWriteTone(buzzerPin, 0); +#else ledcWriteTone(channel, 0); - digitalWrite(channel, 0); +#endif + digitalWrite(buzzerPin, 0); } void beep(void) { diff --git a/src/flight_control.cpp b/src/flight_control.cpp index f8c5f7d066..85c81d0adc 100644 --- a/src/flight_control.cpp +++ b/src/flight_control.cpp @@ -45,6 +45,7 @@ #include "telemetry.hpp" #include "button.hpp" #include "buzzer.h" +#include "arduino_esp32_compat.h" // モータPWM出力Pinのアサイン // Motor PWM Pin @@ -257,6 +258,9 @@ void init_copter(void) { USBSerial.begin(115200); delay(1500); USBSerial.printf("Start StampFly!\r\n"); + USBSerial.printf("Environment: Arduino-ESP32 %s (%s)\r\n", + STAMPFLY_ARDUINO_ESP32_VERSION_STRING, + STAMPFLY_ARDUINO_ESP32_BRANCH_NAME); // Initialize PWM init_pwm(); @@ -271,10 +275,16 @@ void init_copter(void) { // 割り込み設定 // Initialize intrupt +#if STAMPFLY_ARDUINO_ESP32_V3 + timer = timerBegin(1000000); + timerAttachInterrupt(timer, &onTimer); + timerAlarm(timer, 2500, true, 0); +#else timer = timerBegin(0, 80, true); timerAttachInterrupt(timer, &onTimer, true); timerAlarmWrite(timer, 2500, true); timerAlarmEnable(timer); +#endif // init button G0 init_button(); @@ -1019,20 +1029,34 @@ void angle_control(void) { } } +static void write_motor_duty(uint8_t channel, uint32_t duty) { +#if STAMPFLY_ARDUINO_ESP32_V3 + ledcWriteChannel(channel, duty); +#else + ledcWrite(channel, duty); +#endif +} + void set_duty_fr(float duty) { - ledcWrite(FrontRight_motor, (uint32_t)(255 * duty)); + write_motor_duty(FrontRight_motor, (uint32_t)(255 * duty)); } void set_duty_fl(float duty) { - ledcWrite(FrontLeft_motor, (uint32_t)(255 * duty)); + write_motor_duty(FrontLeft_motor, (uint32_t)(255 * duty)); } void set_duty_rr(float duty) { - ledcWrite(RearRight_motor, (uint32_t)(255 * duty)); + write_motor_duty(RearRight_motor, (uint32_t)(255 * duty)); } void set_duty_rl(float duty) { - ledcWrite(RearLeft_motor, (uint32_t)(255 * duty)); + write_motor_duty(RearLeft_motor, (uint32_t)(255 * duty)); } void init_pwm(void) { +#if STAMPFLY_ARDUINO_ESP32_V3 + ledcAttachChannel(pwmFrontLeft, freq, resolution, FrontLeft_motor); + ledcAttachChannel(pwmFrontRight, freq, resolution, FrontRight_motor); + ledcAttachChannel(pwmRearLeft, freq, resolution, RearLeft_motor); + ledcAttachChannel(pwmRearRight, freq, resolution, RearRight_motor); +#else ledcSetup(FrontLeft_motor, freq, resolution); ledcSetup(FrontRight_motor, freq, resolution); ledcSetup(RearLeft_motor, freq, resolution); @@ -1041,6 +1065,7 @@ void init_pwm(void) { ledcAttachPin(pwmFrontRight, FrontRight_motor); ledcAttachPin(pwmRearLeft, RearLeft_motor); ledcAttachPin(pwmRearRight, RearRight_motor); +#endif } uint8_t get_arming_button(void) { @@ -1085,4 +1110,4 @@ void motor_stop(void) { set_duty_fl(0.0); set_duty_rr(0.0); set_duty_rl(0.0); -} \ No newline at end of file +} diff --git a/src/imu.cpp b/src/imu.cpp index 91d477343b..58b2efd32e 100644 --- a/src/imu.cpp +++ b/src/imu.cpp @@ -24,6 +24,7 @@ */ #include +#include "arduino_esp32_compat.h" #include "common.h" #include "bmi2.h" #include "imu.hpp" diff --git a/src/rc.cpp b/src/rc.cpp index 7f45226c69..85dd70f238 100644 --- a/src/rc.cpp +++ b/src/rc.cpp @@ -28,6 +28,10 @@ #include #include #include "flight_control.hpp" +#include "arduino_esp32_compat.h" +#if STAMPFLY_ARDUINO_ESP32_V3 +#include +#endif // esp_now_peer_info_t slave; @@ -50,10 +54,14 @@ esp_now_peer_info_t peerInfo; volatile float Stick[16]; volatile uint8_t Recv_MAC[3]; +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 0, 0) +void on_esp_now_sent(const esp_now_send_info_t *tx_info, esp_now_send_status_t status); +#else void on_esp_now_sent(const uint8_t *mac_addr, esp_now_send_status_t status); +#endif -// 受信コールバック -void OnDataRecv(const uint8_t *mac_addr, const uint8_t *recv_data, int data_len) { +// 受信数据公共处理逻辑 +static void handle_received_data(const uint8_t *src_mac, const uint8_t *recv_data, int data_len) { Connect_flag = 0; uint8_t *d_int; @@ -61,7 +69,7 @@ void OnDataRecv(const uint8_t *mac_addr, const uint8_t *recv_data, int data_len) float d_float; if (!TelemAddr[0] && !TelemAddr[1] && !TelemAddr[2] && !TelemAddr[3] && !TelemAddr[4] && !TelemAddr[5]) { - memcpy(TelemAddr, mac_addr, 6); + memcpy(TelemAddr, src_mac, 6); memcpy(peerInfo.peer_addr, TelemAddr, 6); peerInfo.channel = CHANNEL; peerInfo.encrypt = false; @@ -142,11 +150,30 @@ void OnDataRecv(const uint8_t *mac_addr, const uint8_t *recv_data, int data_len) #endif } +// 受信回调外壳 +#if STAMPFLY_ARDUINO_ESP32_V3 +void OnDataRecv(const esp_now_recv_info_t *info, const uint8_t *recv_data, int data_len) { + handle_received_data(info->src_addr, recv_data, data_len); +} +#else +void OnDataRecv(const uint8_t *mac_addr, const uint8_t *recv_data, int data_len) { + handle_received_data(mac_addr, recv_data, data_len); +} +#endif + // 送信コールバック uint8_t esp_now_send_status; +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 0, 0) +void on_esp_now_sent(const esp_now_send_info_t *tx_info, esp_now_send_status_t status) { + (void)tx_info; + esp_now_send_status = status; +} +#else void on_esp_now_sent(const uint8_t *mac_addr, esp_now_send_status_t status) { + (void)mac_addr; esp_now_send_status = status; } +#endif void rc_init(void) { // Initialize Stick list @@ -156,7 +183,25 @@ void rc_init(void) { WiFi.mode(WIFI_STA); WiFi.disconnect(); +#if STAMPFLY_ARDUINO_ESP32_V3 + esp_err_t mac_status = esp_read_mac((uint8_t *)MyMacAddr, ESP_MAC_WIFI_STA); + bool mac_valid = (mac_status == ESP_OK); + bool mac_is_zero = true; + for (uint8_t i = 0; i < sizeof(MyMacAddr); i++) { + if (MyMacAddr[i] != 0) { + mac_is_zero = false; + break; + } + } + mac_valid = mac_valid && !mac_is_zero; + if (!mac_valid) { + memset((uint8_t *)MyMacAddr, 0, sizeof(MyMacAddr)); + USBSerial.printf("Invalid WiFi STA MAC (esp_read_mac status: %d); pairing broadcast disabled.\r\n", + (int)mac_status); + } +#else WiFi.macAddress((uint8_t *)MyMacAddr); +#endif USBSerial.printf("MAC ADDRESS: %02X:%02X:%02X:%02X:%02X:%02X\r\n", MyMacAddr[0], MyMacAddr[1], MyMacAddr[2], MyMacAddr[3], MyMacAddr[4], MyMacAddr[5]); @@ -179,11 +224,23 @@ void rc_init(void) { esp_wifi_set_channel(CHANNEL, WIFI_SECOND_CHAN_NONE); // Send my MAC address +#if STAMPFLY_ARDUINO_ESP32_V3 + if (mac_valid) { + for (uint16_t i = 0; i < 50; i++) { + send_peer_info(); + delay(50); + USBSerial.printf("%d\n", i); + } + } else { + USBSerial.println("Pairing broadcast skipped because WiFi STA MAC is invalid."); + } +#else for (uint16_t i = 0; i < 50; i++) { send_peer_info(); delay(50); USBSerial.printf("%d\n", i); } +#endif // ESP-NOW再初期化 WiFi.mode(WIFI_STA); diff --git a/src/sensor.cpp b/src/sensor.cpp index 8a66c1241f..0f7aa89636 100644 --- a/src/sensor.cpp +++ b/src/sensor.cpp @@ -24,6 +24,7 @@ */ #include "sensor.hpp" +#include "arduino_esp32_compat.h" #include "imu.hpp" #include "tof.hpp" #include "flight_control.hpp" @@ -359,4 +360,4 @@ float sensor_read(void) { uint32_t et = micros(); // USBSerial.printf("Sensor read %f %f %f\n\r", (mt-st)*1.0e-6, (et-mt)*1e-6, (et-st)*1.0e-6); return (et - st) * 1.0e-6; -} \ No newline at end of file +} diff --git a/src/tof.cpp b/src/tof.cpp index bb7df97226..496a70e221 100644 --- a/src/tof.cpp +++ b/src/tof.cpp @@ -24,6 +24,8 @@ */ #include +#include "arduino_esp32_compat.h" +#include "sensor.hpp" #include "tof.hpp" VL53LX_Dev_t tof_front; @@ -75,6 +77,10 @@ void tof_init(void) { VL53LX_SetDeviceAddress(ToF_front, 0x54); ToF_front->i2c_slave_address = 0x2A; + // Verify the front ToF address before enabling the bottom ToF. + USBSerial.println("I2C scan after front ToF address change"); + scan_i2c(); + delay(100); digitalWrite(XSHUT_BOTTOM, HIGH);