From 7187e5e49e5325147f90f2a1fda5f6c8660b46a9 Mon Sep 17 00:00:00 2001 From: Ken Van Hoeylandt Date: Fri, 3 Jan 2025 23:39:23 +0100 Subject: [PATCH] Improve I2C locking and implement I2C for TactilityC (#147) I2C: - Lock timeout set to reasonable times - Check lock status in all functions - Refactor lock/unlock to return `bool` values - Implement functions in TactilityC Other: - Updated screenshots --- App/CMakeLists.txt | 1 - App/Source/Main.cpp | 11 +- .../LilygoTdeck/Source/hal/TdeckKeyboard.cpp | 2 +- Documentation/ideas.md | 4 +- Documentation/pics/screenshot-Settings.png | Bin 3871 -> 3680 bytes Documentation/pics/screenshot-WifiManage.png | Bin 4973 -> 4974 bytes .../app/i2cscanner/I2cScannerThread.cpp | 2 +- TactilityC/Source/tt_hal_i2c.cpp | 50 +++++++ TactilityC/Source/tt_hal_i2c.h | 27 ++++ TactilityC/Source/tt_init.cpp | 12 ++ TactilityHeadless/Source/hal/i2c/I2c.cpp | 139 +++++++++++------- TactilityHeadless/Source/hal/i2c/I2c.h | 23 ++- TactilityHeadless/Source/hal/i2c/I2cMock.cpp | 10 +- 13 files changed, 207 insertions(+), 74 deletions(-) create mode 100644 TactilityC/Source/tt_hal_i2c.cpp create mode 100644 TactilityC/Source/tt_hal_i2c.h diff --git a/App/CMakeLists.txt b/App/CMakeLists.txt index a17ae984..97296e93 100644 --- a/App/CMakeLists.txt +++ b/App/CMakeLists.txt @@ -28,7 +28,6 @@ else() add_executable(AppSim ${SOURCES}) target_link_libraries(AppSim PRIVATE Tactility - PRIVATE TactilityC PRIVATE TactilityCore PRIVATE TactilityHeadless PRIVATE Simulator diff --git a/App/Source/Main.cpp b/App/Source/Main.cpp index 34486635..2ff4dbce 100644 --- a/App/Source/Main.cpp +++ b/App/Source/Main.cpp @@ -1,12 +1,9 @@ #include "Boards.h" - -// Apps #include "Tactility.h" -#include "tt_init.h" -namespace tt::service::wifi { - extern void wifi_task(void*); -} +#ifdef ESP_PLATFORM +#include "tt_init.h" +#endif extern const tt::app::AppManifest hello_world_app; @@ -26,7 +23,9 @@ void app_main() { .autoStartAppId = nullptr }; +#ifdef ESP_PLATFORM tt_init_tactility_c(); // ELF bindings for side-loading on ESP32 +#endif tt::run(config); } diff --git a/Boards/LilygoTdeck/Source/hal/TdeckKeyboard.cpp b/Boards/LilygoTdeck/Source/hal/TdeckKeyboard.cpp index b1fe6ea3..427d56ae 100644 --- a/Boards/LilygoTdeck/Source/hal/TdeckKeyboard.cpp +++ b/Boards/LilygoTdeck/Source/hal/TdeckKeyboard.cpp @@ -59,7 +59,7 @@ bool TdeckKeyboard::stop() { } bool TdeckKeyboard::isAttached() const { - return tt::hal::i2c::masterCheckAddressForDevice(TDECK_KEYBOARD_I2C_BUS_HANDLE, TDECK_KEYBOARD_SLAVE_ADDRESS, 100); + return tt::hal::i2c::masterHasDeviceAtAddress(TDECK_KEYBOARD_I2C_BUS_HANDLE, TDECK_KEYBOARD_SLAVE_ADDRESS, 100); } tt::hal::Keyboard* createKeyboard() { diff --git a/Documentation/ideas.md b/Documentation/ideas.md index d9a05816..9f4814b7 100644 --- a/Documentation/ideas.md +++ b/Documentation/ideas.md @@ -1,17 +1,15 @@ # Bugs -- I2C Scanner is on M5Stack devices is broken - WiFi bug: when pressing disconnect while between `WIFI_EVENT_STA_START` and `IP_EVENT_STA_GOT_IP`, then auto-connect becomes active again. - ESP32 (CYD) memory issues (or any device without PSRAM): - Boot app doesn't show logo - WiFi is on and navigating back to Desktop makes desktop icons disappear - - WiFi might fail quiety when trying to enable it: this shows no feedback (force it by increasing LVGL buffers to 100kB) + - WiFi might fail quietly when trying to enable it: this shows no feedback (force it by increasing LVGL buffers to 100kB) Possible mitigations: - When no PSRAM is available, use simplified desktop buttons - Add statusbar icon for memory pressure. - Show error in WiFi screen (e.g. AlertDialog when SPI is not enabled and available memory is below a certain amount) - Clean up static_cast when casting to base class. - M5Stack CoreS3 SD card mounts, but cannot be read. There is currently a notice about it [here](https://github.com/espressif/esp-bsp/blob/master/bsp/m5stack_core_s3/README.md). -- hal::I2c has inconsistent return values for read/write functions # TODOs - Call tt::lvgl::isSyncSet after HAL init and show error (and crash?) when it is not set. diff --git a/Documentation/pics/screenshot-Settings.png b/Documentation/pics/screenshot-Settings.png index 0a173faa22ea96060433e047b2d4eaa7792ff5da..917749a28aeee65b4d150c103a23a0b5e352bc46 100644 GIT binary patch delta 3046 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 tfh( delta 3193 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 diff --git a/Documentation/pics/screenshot-WifiManage.png b/Documentation/pics/screenshot-WifiManage.png index 919d7724bdc3cb8bed64ee194e45e321949530f6..0c1478fc787c29cc3bb0e2071a762196b35ee943 100644 GIT binary patch delta 4327 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

(hMIGgu}yBikn z9kC}Zp9Y%l0TtF&v@V~GXY6xO_DUx>bzq}?bIyg^_`nmVp4#_)2OYfH@JKuyqaNpld>e39#`^J@Elzu}>O`Yg9gB?$x(Xql z_=WeMeRFSK%N*~R65HTNbt+hstv@tCEV29+C250z{kVU#K&?!!hWz~jzrb8@HU@ms z&Irr#oSY~Ljd|X@`)Tq1!vILF3{h;!(SGYqVVfVUXq{>aT|ZU=?3}Tcl)O$kU42b zMp%HNTXw7o7ksi0E58oCdAe8l=xpAcC6H$O1;85bf5NwfAV`@2VPQ}`prGI@uq*Lu zy}zj3U!a)szfp0JV@}So0Z9{_Y^PwHUx;FU-ZvtY&cnS|Tlj!g*F zT{7e2EKv-@>V1Sz4$Be0K($pK$ZvA>L-*j54&v0I6j22xH zw#hJc)T}^mRwVD=VHfk6pHc)ovz!1^47)Iby^04T`qcF*;o$CAc{c6GWmM}RmRcsx zu~+PHL{#PB<>-iu&QI{64h%M;0o(%X&{Uuf(*aRNlemOal;oIor1ikpvh_uo*FDm0 z!~^0}E-h%e7;n;X9GRcKU0h?plNjB zf^{;@^4>T2y^1n-_jM8rug~)f&1XK*Fh6xb^p4L0?|H@i@bb@H9ap$2Xnl>!`?Vxw zq}~_xEHE;dEn5&HlIb0=M?gnv3UA=R3fG3b0_kWO3$c|9zh?g^S@Epb5*!54+&k}Q zur>vcqlMlaN)R42{X9rD&D9e;ls!g$8zd|m^6Dn22$MexxF!nTp*k75S_YcW)p3#k E0?zpwZU6uP delta 4326 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 context) { for (uint8_t address = 0; address < 128; ++address) { i2c_port_t port; if (getPort(data, &port)) { - if (hal::i2c::masterCheckAddressForDevice(port, address, 10 / portTICK_PERIOD_MS)) { + if (hal::i2c::masterHasDeviceAtAddress(port, address, 10 / portTICK_PERIOD_MS)) { TT_LOG_I(TAG, "Found device at address %d", address); if (!shouldStopScanTimer(data)) { addAddressToList(data, address); diff --git a/TactilityC/Source/tt_hal_i2c.cpp b/TactilityC/Source/tt_hal_i2c.cpp new file mode 100644 index 00000000..85e7c4d6 --- /dev/null +++ b/TactilityC/Source/tt_hal_i2c.cpp @@ -0,0 +1,50 @@ +#include "tt_hal_i2c.h" +#include "hal/i2c/I2c.h" + +extern "C" { + +bool tt_hal_i2c_start(i2c_port_t port) { + return tt::hal::i2c::start(port); +} + +bool tt_hal_i2c_stop(i2c_port_t port) { + return tt::hal::i2c::stop(port); +} + +bool tt_hal_i2c_is_started(i2c_port_t port) { + return tt::hal::i2c::isStarted(port); +} + +bool tt_hal_i2c_master_read(i2c_port_t port, uint8_t address, uint8_t* data, size_t dataSize, TickType_t timeout) { + return tt::hal::i2c::masterRead(port, address, data, dataSize, timeout); +} + +bool tt_hal_i2c_master_read_register(i2c_port_t port, uint8_t address, uint8_t reg, uint8_t* data, size_t dataSize, TickType_t timeout) { + return tt::hal::i2c::masterRead(port, address, reg, data, dataSize, timeout); +} + +bool tt_hal_i2c_master_write(i2c_port_t port, uint16_t address, const uint8_t* data, uint16_t dataSize, TickType_t timeout) { + return tt::hal::i2c::masterWrite(port, address, data, dataSize, timeout); +} + +bool tt_hal_i2c_master_write_register(i2c_port_t port, uint16_t address, uint8_t reg, const uint8_t* data, uint16_t dataSize, TickType_t timeout) { + return tt::hal::i2c::masterWrite(port, address, reg, data, dataSize, timeout); +} + +bool tt_hal_i2c_master_write_read(i2c_port_t port, uint8_t address, const uint8_t* writeData, size_t writeDataSize, uint8_t* readData, size_t readDataSize, TickType_t timeout) { + return tt::hal::i2c::masterWriteRead(port, address, writeData, writeDataSize, readData, readDataSize, timeout); +} + +bool tt_hal_i2c_master_has_device_at_address(i2c_port_t port, uint8_t address, TickType_t timeout) { + return tt::hal::i2c::masterHasDeviceAtAddress(port, address, timeout); +} + +bool tt_hal_i2c_lock(i2c_port_t port, TickType_t timeout) { + return tt::hal::i2c::lock(port, timeout); +} + +bool tt_hal_i2c_unlock(i2c_port_t port) { + return tt::hal::i2c::unlock(port); +} + +} \ No newline at end of file diff --git a/TactilityC/Source/tt_hal_i2c.h b/TactilityC/Source/tt_hal_i2c.h new file mode 100644 index 00000000..e0696f20 --- /dev/null +++ b/TactilityC/Source/tt_hal_i2c.h @@ -0,0 +1,27 @@ +#pragma once + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +bool tt_hal_i2c_start(i2c_port_t port); +bool tt_hal_i2c_stop(i2c_port_t port); +bool tt_hal_i2c_is_started(i2c_port_t port); + +bool tt_hal_i2c_master_read(i2c_port_t port, uint8_t address, uint8_t* data, size_t dataSize, TickType_t timeout); +bool tt_hal_i2c_master_read_register(i2c_port_t port, uint8_t address, uint8_t reg, uint8_t* data, size_t dataSize, TickType_t timeout); +bool tt_hal_i2c_master_write(i2c_port_t port, uint16_t address, const uint8_t* data, uint16_t dataSize, TickType_t timeout); +bool tt_hal_i2c_master_write_register(i2c_port_t port, uint16_t address, uint8_t reg, const uint8_t* data, uint16_t dataSize, TickType_t timeout); +bool tt_hal_i2c_master_write_read(i2c_port_t port, uint8_t address, const uint8_t* writeData, size_t writeDataSize, uint8_t* readData, size_t readDataSize, TickType_t timeout); +bool tt_hal_i2c_master_has_device_at_address(i2c_port_t port, uint8_t address, TickType_t timeout); + +bool tt_hal_i2c_lock(i2c_port_t port, TickType_t timeout); +bool tt_hal_i2c_unlock(i2c_port_t port); + +#ifdef __cplusplus +} +#endif \ No newline at end of file diff --git a/TactilityC/Source/tt_init.cpp b/TactilityC/Source/tt_init.cpp index a7d49e64..36564048 100644 --- a/TactilityC/Source/tt_init.cpp +++ b/TactilityC/Source/tt_init.cpp @@ -7,6 +7,7 @@ #include "tt_app_alertdialog.h" #include "tt_app_selectiondialog.h" #include "tt_bundle.h" +#include "tt_hal_i2c.h" #include "tt_lvgl_spinner.h" #include "tt_lvgl_toolbar.h" #include "tt_message_queue.h" @@ -39,6 +40,17 @@ const struct esp_elfsym elf_symbols[] { ESP_ELFSYM_EXPORT(tt_bundle_put_int32), ESP_ELFSYM_EXPORT(tt_bundle_put_string), ESP_ELFSYM_EXPORT(tt_set_app_manifest), + ESP_ELFSYM_EXPORT(tt_hal_i2c_start), + ESP_ELFSYM_EXPORT(tt_hal_i2c_stop), + ESP_ELFSYM_EXPORT(tt_hal_i2c_is_started), + ESP_ELFSYM_EXPORT(tt_hal_i2c_master_read), + ESP_ELFSYM_EXPORT(tt_hal_i2c_master_read_register), + ESP_ELFSYM_EXPORT(tt_hal_i2c_master_write), + ESP_ELFSYM_EXPORT(tt_hal_i2c_master_write_register), + ESP_ELFSYM_EXPORT(tt_hal_i2c_master_write_read), + ESP_ELFSYM_EXPORT(tt_hal_i2c_master_has_device_at_address), + ESP_ELFSYM_EXPORT(tt_hal_i2c_lock), + ESP_ELFSYM_EXPORT(tt_hal_i2c_unlock), ESP_ELFSYM_EXPORT(tt_lvgl_toolbar_create), ESP_ELFSYM_EXPORT(tt_lvgl_toolbar_create_simple), ESP_ELFSYM_EXPORT(tt_message_queue_alloc), diff --git a/TactilityHeadless/Source/hal/i2c/I2c.cpp b/TactilityHeadless/Source/hal/i2c/I2c.cpp index 1eebf8cf..4cfb9558 100644 --- a/TactilityHeadless/Source/hal/i2c/I2c.cpp +++ b/TactilityHeadless/Source/hal/i2c/I2c.cpp @@ -58,7 +58,7 @@ bool init(const std::vector& configurations) { return true; } -static bool configure_locked(i2c_port_t port, const i2c_config_t& configuration) { +static bool configureLocked(i2c_port_t port, const i2c_config_t& configuration) { Data& data = dataArray[port]; if (data.isStarted) { TT_LOG_E(TAG, "(%d) Cannot reconfigure while interface is started", port); @@ -73,10 +73,14 @@ static bool configure_locked(i2c_port_t port, const i2c_config_t& configuration) } bool configure(i2c_port_t port, const i2c_config_t& configuration) { - lock(port); - bool result = configure_locked(port, configuration); - unlock(port); - return result; + if (lock(port)) { + bool result = configureLocked(port, configuration); + unlock(port); + return result; + } else { + TT_LOG_E(TAG, "(%d) Mutex timeout", port); + return false; + } } static bool startLocked(i2c_port_t port) { @@ -113,10 +117,14 @@ static bool startLocked(i2c_port_t port) { } bool start(i2c_port_t port) { - lock(port); - bool result = startLocked(port); - unlock(port); - return result; + if (lock(port)) { + bool result = startLocked(port); + unlock(port); + return result; + } else { + TT_LOG_E(TAG, "(%d) Mutex timeout", port); + return false; + } } static bool stopLocked(i2c_port_t port) { @@ -146,30 +154,45 @@ static bool stopLocked(i2c_port_t port) { } bool stop(i2c_port_t port) { - lock(port); - bool result = stopLocked(port); - unlock(port); - return result; + if (lock(port)) { + bool result = stopLocked(port); + unlock(port); + return result; + } else { + TT_LOG_E(TAG, "(%d) Mutex timeout", port); + return false; + } } bool isStarted(i2c_port_t port) { - lock(port); - bool started = dataArray[port].isStarted; - unlock(port); - return started; + if (lock(port, 50 / portTICK_PERIOD_MS)) { + bool started = dataArray[port].isStarted; + unlock(port); + return started; + } else { + // If we can't get a lock, we assume the device is busy and thus has started + return true; + } } bool masterRead(i2c_port_t port, uint8_t address, uint8_t* data, size_t dataSize, TickType_t timeout) { - lock(port); - esp_err_t result = i2c_master_read_from_device(port, address, data, dataSize, timeout); - unlock(port); - return result == ESP_OK; + if (lock(port)) { + esp_err_t result = i2c_master_read_from_device(port, address, data, dataSize, timeout); + unlock(port); + return result == ESP_OK; + } else { + TT_LOG_E(TAG, "(%d) Mutex timeout", port); + return false; + } } -esp_err_t masterRead(i2c_port_t port, uint8_t address, uint8_t reg, uint8_t* data, size_t dataSize, TickType_t timeout) { +bool masterRead(i2c_port_t port, uint8_t address, uint8_t reg, uint8_t* data, size_t dataSize, TickType_t timeout) { tt_check(reg != 0); - lock(port); + if (!lock(port)) { + TT_LOG_E(TAG, "(%d) Mutex timeout", port); + return false; + } i2c_cmd_handle_t cmd = i2c_cmd_link_create(); // Set address pointer @@ -187,24 +210,32 @@ esp_err_t masterRead(i2c_port_t port, uint8_t address, uint8_t reg, uint8_t* dat esp_err_t result = i2c_master_cmd_begin(port, cmd, timeout); i2c_cmd_link_delete(cmd); + unlock(port); + ESP_LOG_BUFFER_HEX_LEVEL(TAG, data, dataSize, ESP_LOG_DEBUG); ESP_ERROR_CHECK_WITHOUT_ABORT(result); - unlock(port); - return result; -} - -bool masterWrite(i2c_port_t port, uint16_t address, const uint8_t* data, uint16_t dataSize, TickType_t timeout) { - lock(port); - esp_err_t result = i2c_master_write_to_device(port, address, data, dataSize, timeout); - unlock(port); return result == ESP_OK; } -esp_err_t masterWrite(i2c_port_t port, uint16_t address, uint8_t reg, const uint8_t* data, uint16_t dataSize, TickType_t timeout) { +bool masterWrite(i2c_port_t port, uint16_t address, const uint8_t* data, uint16_t dataSize, TickType_t timeout) { + if (lock(port)) { + esp_err_t result = i2c_master_write_to_device(port, address, data, dataSize, timeout); + unlock(port); + return result == ESP_OK; + } else { + TT_LOG_E(TAG, "(%d) Mutex timeout", port); + return false; + } +} + +bool masterWrite(i2c_port_t port, uint16_t address, uint8_t reg, const uint8_t* data, uint16_t dataSize, TickType_t timeout) { tt_check(reg != 0); - lock(port); + if (!lock(port)) { + TT_LOG_E(TAG, "(%d) Mutex timeout", port); + return false; + } i2c_cmd_handle_t cmd = i2c_cmd_link_create(); i2c_master_start(cmd); @@ -215,34 +246,42 @@ esp_err_t masterWrite(i2c_port_t port, uint16_t address, uint8_t reg, const uint esp_err_t result = i2c_master_cmd_begin(port, cmd, timeout); i2c_cmd_link_delete(cmd); - ESP_ERROR_CHECK_WITHOUT_ABORT(result); - unlock(port); - return result; + ESP_ERROR_CHECK_WITHOUT_ABORT(result); + + return result == ESP_OK; } bool masterWriteRead(i2c_port_t port, uint8_t address, const uint8_t* writeData, size_t writeDataSize, uint8_t* readData, size_t readDataSize, TickType_t timeout) { - lock(port); - esp_err_t result = i2c_master_write_read_device(port, address, writeData, writeDataSize, readData, readDataSize, timeout); - unlock(port); - return result == ESP_OK; + if (lock(port)) { + esp_err_t result = i2c_master_write_read_device(port, address, writeData, writeDataSize, readData, readDataSize, timeout); + unlock(port); + return result == ESP_OK; + } else { + TT_LOG_E(TAG, "(%d) Mutex timeout", port); + return false; + } } -bool masterCheckAddressForDevice(i2c_port_t port, uint8_t address, TickType_t timeout) { - lock(port); - uint8_t message[2] = { 0, 0 }; - esp_err_t result = i2c_master_write_to_device(port, address, message, 2, timeout); - unlock(port); - return result == ESP_OK; +bool masterHasDeviceAtAddress(i2c_port_t port, uint8_t address, TickType_t timeout) { + if (lock(port)) { + uint8_t message[2] = { 0, 0 }; + esp_err_t result = i2c_master_write_to_device(port, address, message, 2, timeout); + unlock(port); + return result == ESP_OK; + } else { + TT_LOG_E(TAG, "(%d) Mutex timeout", port); + return false; + } } -TtStatus lock(i2c_port_t port, TickType_t timeout) { - return dataArray[port].mutex.acquire(timeout); +bool lock(i2c_port_t port, TickType_t timeout) { + return dataArray[port].mutex.lock(timeout); } -TtStatus unlock(i2c_port_t port) { - return dataArray[port].mutex.release(); +bool unlock(i2c_port_t port) { + return dataArray[port].mutex.unlock(); } } // namespace diff --git a/TactilityHeadless/Source/hal/i2c/I2c.h b/TactilityHeadless/Source/hal/i2c/I2c.h index a04e43e4..648271c3 100644 --- a/TactilityHeadless/Source/hal/i2c/I2c.h +++ b/TactilityHeadless/Source/hal/i2c/I2c.h @@ -15,7 +15,7 @@ typedef enum { InitDisabled // Not initialized by default } InitMode; -typedef struct { +struct Configuration { std::string name; /** The port to operate on */ i2c_port_t port; @@ -27,20 +27,29 @@ typedef struct { bool hasMutableConfiguration; /** Configuration that must be valid when initAtBoot is set to true. */ i2c_config_t config; -} Configuration; +}; + +enum Status { + STARTED, + STOPPED, + UNKNOWN +}; + bool init(const std::vector& configurations); bool start(i2c_port_t port); bool stop(i2c_port_t port); bool isStarted(i2c_port_t port); + bool masterRead(i2c_port_t port, uint8_t address, uint8_t* data, size_t dataSize, TickType_t timeout); -esp_err_t masterRead(i2c_port_t port, uint8_t address, uint8_t reg, uint8_t* data, size_t dataSize, TickType_t timeout); +bool masterRead(i2c_port_t port, uint8_t address, uint8_t reg, uint8_t* data, size_t dataSize, TickType_t timeout); bool masterWrite(i2c_port_t port, uint16_t address, const uint8_t* data, uint16_t dataSize, TickType_t timeout); -esp_err_t masterWrite(i2c_port_t port, uint16_t address, uint8_t reg, const uint8_t* data, uint16_t dataSize, TickType_t timeout); +bool masterWrite(i2c_port_t port, uint16_t address, uint8_t reg, const uint8_t* data, uint16_t dataSize, TickType_t timeout); bool masterWriteRead(i2c_port_t port, uint8_t address, const uint8_t* writeData, size_t writeDataSize, uint8_t* readData, size_t readDataSize, TickType_t timeout); -bool masterCheckAddressForDevice(i2c_port_t port, uint8_t address, TickType_t timeout); -TtStatus lock(i2c_port_t port, TickType_t timeout = UINT_MAX); -TtStatus unlock(i2c_port_t port); +bool masterHasDeviceAtAddress(i2c_port_t port, uint8_t address, TickType_t timeout); + +bool lock(i2c_port_t port, TickType_t timeout = 10 / portTICK_PERIOD_MS); +bool unlock(i2c_port_t port); } // namespace diff --git a/TactilityHeadless/Source/hal/i2c/I2cMock.cpp b/TactilityHeadless/Source/hal/i2c/I2cMock.cpp index f4f0e88f..1d6a3378 100644 --- a/TactilityHeadless/Source/hal/i2c/I2cMock.cpp +++ b/TactilityHeadless/Source/hal/i2c/I2cMock.cpp @@ -88,15 +88,15 @@ bool write(i2c_port_t port, uint16_t address, uint32_t reg, const uint8_t* buffe return false; } -TtStatus lock(i2c_port_t port, TickType_t timeout) { - return dataArray[port].mutex.acquire(timeout); +bool lock(i2c_port_t port, TickType_t timeout) { + return dataArray[port].mutex.lock(timeout); } -TtStatus unlock(i2c_port_t port) { - return dataArray[port].mutex.release(); +bool unlock(i2c_port_t port) { + return dataArray[port].mutex.unlock(); } -bool masterCheckAddressForDevice(i2c_port_t port, uint8_t address, TickType_t timeout) { +bool masterHasDeviceAtAddress(i2c_port_t port, uint8_t address, TickType_t timeout) { return (rand()) % 25 == 0; }