diff --git a/universal7885-common/apps/aidl-support/fm/default/CommonMacro.h b/universal7885-common/apps/aidl-support/fm/default/CommonMacro.h new file mode 100644 index 0000000..61e155e --- /dev/null +++ b/universal7885-common/apps/aidl-support/fm/default/CommonMacro.h @@ -0,0 +1,15 @@ +#pragma once + +#include + +#define RETURN_IF_FAILED_LOCK \ +({ \ + if (!lock.try_lock_for(std::chrono::milliseconds(100))) \ + return ::ndk::ScopedAStatus::fromServiceSpecificError(-ETIME); \ +}) + +#define NOT_SUPPORTED \ +({ \ + LOG(ERROR) << __func__ << ": Attempted to invoke unsupported operation"; \ + return ::ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); \ +}) diff --git a/universal7885-common/apps/aidl-support/fm/default/FMDevControl.cpp b/universal7885-common/apps/aidl-support/fm/default/FMDevControl.cpp index d84725f..d13d9de 100644 --- a/universal7885-common/apps/aidl-support/fm/default/FMDevControl.cpp +++ b/universal7885-common/apps/aidl-support/fm/default/FMDevControl.cpp @@ -19,21 +19,25 @@ #include #include +#include + #include +#include "CommonMacro.h" + #include namespace aidl::vendor::eureka::hardware::fmradio { -static int fd = -1; - ::ndk::ScopedAStatus FMDevControl::open(void) { fd = fm_radio_slsi::open_device(); assert(fd > 0); fm_radio_slsi::bootctrl(fd); return ::ndk::ScopedAStatus::ok(); } + ::ndk::ScopedAStatus FMDevControl::getValue(GetType type, int *_aidl_return) { + RETURN_IF_FAILED_LOCK; assert(fd > 0); switch (type) { case GetType::GET_TYPE_FM_FREQ: @@ -57,14 +61,16 @@ static int fd = -1; *_aidl_return = fm_radio_slsi::next_channel(fd); break; case GetType::GET_TYPE_FM_SYSFS_IF: - [[fallthrough]]; + NOT_SUPPORTED; default: break; }; + lock.unlock(); return ::ndk::ScopedAStatus::ok(); } ::ndk::ScopedAStatus FMDevControl::setValue(SetType type, int value) { + RETURN_IF_FAILED_LOCK; assert(fd > 0); std::shared_ptr svc; switch (type) { @@ -93,13 +99,17 @@ static int fd = -1; default: break; }; + lock.unlock(); return ::ndk::ScopedAStatus::ok(); } ::ndk::ScopedAStatus FMDevControl::getFreqsList(std::vector *_aidl_return){ + RETURN_IF_FAILED_LOCK; auto vec = fm_radio_slsi::get_freqs(fd); for (auto i : vec) _aidl_return->push_back(i); + + lock.unlock(); return ::ndk::ScopedAStatus::ok(); } diff --git a/universal7885-common/apps/aidl-support/fm/default/FMDevControl.h b/universal7885-common/apps/aidl-support/fm/default/FMDevControl.h index 1a2d9a8..1c263ea 100644 --- a/universal7885-common/apps/aidl-support/fm/default/FMDevControl.h +++ b/universal7885-common/apps/aidl-support/fm/default/FMDevControl.h @@ -16,10 +16,12 @@ #include +#include + namespace aidl::vendor::eureka::hardware::fmradio { struct FMDevControl : public BnFMDevControl { -public: + public: FMDevControl() = default; // Methods from aidl::vendor::eureka::hardware::fmradio::IFMRadio follow. ::ndk::ScopedAStatus open(void) override; @@ -27,5 +29,8 @@ public: ::ndk::ScopedAStatus setValue(SetType type, int value) override; ::ndk::ScopedAStatus getFreqsList(std::vector *_aidl_return) override; ::ndk::ScopedAStatus close(void) override; + private: + int fd; + std::timed_mutex lock; }; } // namespace aidl::vendor::eureka::hardware::fmradio diff --git a/universal7885-common/apps/aidl-support/fm/default/FMSupport.cpp b/universal7885-common/apps/aidl-support/fm/default/FMSupport.cpp index 8e7d7ff..cb11794 100644 --- a/universal7885-common/apps/aidl-support/fm/default/FMSupport.cpp +++ b/universal7885-common/apps/aidl-support/fm/default/FMSupport.cpp @@ -22,13 +22,7 @@ #include -#include - -#define NOT_SUPPORTED \ - ({ \ - LOG(ERROR) << __func__ << ": Attempted to invoke unsupported operation"; \ - return ::ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); \ - }) +#include "CommonMacro.h" namespace aidl::vendor::eureka::hardware::fmradio { @@ -40,6 +34,7 @@ constexpr const char *FM_FREQ_SEEK = ::ndk::ScopedAStatus FMSupport::open(void) { NOT_SUPPORTED; } ::ndk::ScopedAStatus FMSupport::getValue(GetType type, int *_aidl_return) { + RETURN_IF_FAILED_LOCK; switch (type) { case GetType::GET_TYPE_FM_FREQ: *_aidl_return = FileIO::readline(FM_FREQ_CTL); @@ -62,9 +57,11 @@ constexpr const char *FM_FREQ_SEEK = default: break; }; + lock.unlock(); return ndk::ScopedAStatus::ok(); } ::ndk::ScopedAStatus FMSupport::setValue(SetType type, int value) { + RETURN_IF_FAILED_LOCK; switch (type) { case SetType::SET_TYPE_FM_FREQ: FileIO::writeline(FM_FREQ_CTL, value * 1000); @@ -79,6 +76,7 @@ constexpr const char *FM_FREQ_SEEK = default: break; }; + lock.unlock(); return ::ndk::ScopedAStatus::ok(); } @@ -92,6 +90,7 @@ static inline bool vector_contains(const std::vector vec, } ::ndk::ScopedAStatus FMSupport::getFreqsList(std::vector *_aidl_return) { + RETURN_IF_FAILED_LOCK; for (int i = 0; i < TRACK_SIZE; i++) { FileIO::writeline(FM_FREQ_SEEK, "1 " + std::to_string(3 * 10)); int freq = FileIO::readline(FM_FREQ_CTL); @@ -99,6 +98,7 @@ static inline bool vector_contains(const std::vector vec, continue; _aidl_return->push_back(freq); } + lock.unlock(); return ::ndk::ScopedAStatus::ok(); } ::ndk::ScopedAStatus FMSupport::close() { NOT_SUPPORTED; } diff --git a/universal7885-common/apps/aidl-support/fm/default/FMSupport.h b/universal7885-common/apps/aidl-support/fm/default/FMSupport.h index 1d43119..44ed965 100644 --- a/universal7885-common/apps/aidl-support/fm/default/FMSupport.h +++ b/universal7885-common/apps/aidl-support/fm/default/FMSupport.h @@ -16,6 +16,8 @@ #include +#include + namespace aidl::vendor::eureka::hardware::fmradio { struct FMSupport : public BnFMDevControl { @@ -27,5 +29,7 @@ public: ::ndk::ScopedAStatus setValue(SetType type, int value) override; ::ndk::ScopedAStatus getFreqsList(std::vector *_aidl_return) override; ::ndk::ScopedAStatus close(void) override; + private: + std::timed_mutex lock; }; } // namespace aidl::vendor::eureka::hardware::fmradio diff --git a/universal7885-common/apps/aidl-support/parts/default/SmartCharge.cpp b/universal7885-common/apps/aidl-support/parts/default/SmartCharge.cpp index 5250439..ebb29b5 100644 --- a/universal7885-common/apps/aidl-support/parts/default/SmartCharge.cpp +++ b/universal7885-common/apps/aidl-support/parts/default/SmartCharge.cpp @@ -16,6 +16,8 @@ #include #include +#include +#include "BatteryConstants.h" namespace aidl::vendor::eureka::hardware::parts { @@ -25,7 +27,7 @@ static int restart = 0; static int limit_stat = 0; static int restart_stat = 0; -static std::thread monitor_th = nullptr; +static std::thread *monitor_th = nullptr; static void battery_monitor(void) { while (true) { @@ -46,7 +48,7 @@ static void battery_monitor(void) { return ::ndk::ScopedAStatus::fromExceptionCodeWithMessage( EX_ILLEGAL_ARGUMENT, "Start called without configuring."); - monitor_th = std::thread(battery_monitor); + monitor_th = new std::thread(battery_monitor); return ::ndk::ScopedAStatus::ok(); }