diff --git a/universal7885-common/apps/aidl-support/fm/default/Android.bp b/universal7885-common/apps/aidl-support/fm/default/Android.bp index 52c2fec..feb6c9c 100644 --- a/universal7885-common/apps/aidl-support/fm/default/Android.bp +++ b/universal7885-common/apps/aidl-support/fm/default/Android.bp @@ -2,7 +2,8 @@ cc_defaults { name: "fm_aidl_defaults", cflags: [ "-DTRACK_SIZE=30", - "-DSYSFS_SPACING=3",], + "-DSYSFS_SPACING=3", + ], } cc_binary { @@ -22,7 +23,7 @@ cc_binary { "libbinder_ndk", "liblog", "libfileio", - "vendor.eureka.hardware.fmradio-V1-ndk", + "vendor.eureka.hardware.fmradio-V2-ndk", "vendor.eureka.hardware.audio_route-V1-ndk", ], header_libs: ["libaudioclient_headers"], diff --git a/universal7885-common/apps/aidl-support/fm/default/FMDevControl.cpp b/universal7885-common/apps/aidl-support/fm/default/FMDevControl.cpp index d13d9de..2ecd61e 100644 --- a/universal7885-common/apps/aidl-support/fm/default/FMDevControl.cpp +++ b/universal7885-common/apps/aidl-support/fm/default/FMDevControl.cpp @@ -41,9 +41,7 @@ namespace aidl::vendor::eureka::hardware::fmradio { assert(fd > 0); switch (type) { case GetType::GET_TYPE_FM_FREQ: - int64_t freq; - fm_radio_slsi::get_frequency(fd, &freq); - *_aidl_return = freq; + fm_radio_slsi::get_frequency(fd, _aidl_return); break; case GetType::GET_TYPE_FM_UPPER_LIMIT: *_aidl_return = fm_radio_slsi::get_upperband_limit(fd); @@ -55,13 +53,25 @@ namespace aidl::vendor::eureka::hardware::fmradio { *_aidl_return = fm_radio_slsi::get_rmssi(fd); break; case GetType::GET_TYPE_FM_BEFORE_CHANNEL: - *_aidl_return = fm_radio_slsi::before_channel(fd); + if (index > 0) index -= 1; + fm_radio_slsi::set_frequency(fd, freqs_list[index]); + *_aidl_return = freqs_list[index]; break; case GetType::GET_TYPE_FM_NEXT_CHANNEL: - *_aidl_return = fm_radio_slsi::next_channel(fd); + if (index < freqs_list.size() - 1) index += 1; + fm_radio_slsi::set_frequency(fd, freqs_list[index]); + *_aidl_return = freqs_list[index]; break; case GetType::GET_TYPE_FM_SYSFS_IF: NOT_SUPPORTED; + case GetType::GET_TYPE_FM_MUTEX_LOCKED: + if (lock.try_lock()){ + *_aidl_return = false; + lock.unlock(); + } else { + *_aidl_return = true; + } + break; default: break; }; @@ -96,19 +106,22 @@ namespace aidl::vendor::eureka::hardware::fmradio { svc = audio_route::IAudioRoute::fromBinder(ndk::SpAIBinder(AServiceManager_waitForService("vendor.eureka.hardware.audio_route.IAudioRoute/default"))); svc->setParam(value ? "routing=2": "routing=8"); break; + case SetType::SET_TYPE_FM_SEARCH_START: + search_thread = std::thread([this] { + freqs_list = fm_radio_slsi::get_freqs(fd); + lock.unlock(); + }); + break; default: break; }; - lock.unlock(); + if (type != SetType::SET_TYPE_FM_SEARCH_START) 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); - + *_aidl_return = freqs_list; 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 1c263ea..e3cb025 100644 --- a/universal7885-common/apps/aidl-support/fm/default/FMDevControl.h +++ b/universal7885-common/apps/aidl-support/fm/default/FMDevControl.h @@ -17,12 +17,15 @@ #include #include +#include namespace aidl::vendor::eureka::hardware::fmradio { struct FMDevControl : public BnFMDevControl { public: - FMDevControl() = default; + FMDevControl(void) { + index = 0; + } // Methods from aidl::vendor::eureka::hardware::fmradio::IFMRadio follow. ::ndk::ScopedAStatus open(void) override; ::ndk::ScopedAStatus getValue(GetType type, int *_aidl_return) override; @@ -31,6 +34,9 @@ struct FMDevControl : public BnFMDevControl { ::ndk::ScopedAStatus close(void) override; private: int fd; + unsigned int index; std::timed_mutex lock; + std::thread search_thread; + std::vector freqs_list; }; } // 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 bf80f38..aa31941 100644 --- a/universal7885-common/apps/aidl-support/fm/default/FMSupport.cpp +++ b/universal7885-common/apps/aidl-support/fm/default/FMSupport.cpp @@ -14,7 +14,7 @@ #include "FMSupport.h" -#include +#include #include #include @@ -26,10 +26,9 @@ namespace aidl::vendor::eureka::hardware::fmradio { -constexpr const char *FM_FREQ_CTL = - "/sys/devices/virtual/s610_radio/s610_radio/radio_freq_ctrl"; -constexpr const char *FM_FREQ_SEEK = - "/sys/devices/virtual/s610_radio/s610_radio/radio_freq_seek"; +#define FM_SYSFS_BASE "/sys/devices/virtual/s610_radio/s610_radio" +constexpr const char *FM_FREQ_CTL = FM_SYSFS_BASE "/radio_freq_ctrl"; +constexpr const char *FM_FREQ_SEEK = FM_SYSFS_BASE "/radio_freq_seek"; ::ndk::ScopedAStatus FMSupport::open(void) { NOT_SUPPORTED; } @@ -52,7 +51,15 @@ constexpr const char *FM_FREQ_SEEK = *_aidl_return = FileIO::readline(FM_FREQ_CTL); break; case GetType::GET_TYPE_FM_SYSFS_IF: - *_aidl_return = access("/sys/devices/virtual/s610_radio/s610_radio/", F_OK); + *_aidl_return = access(FM_SYSFS_BASE, F_OK); + break; + case GetType::GET_TYPE_FM_MUTEX_LOCKED: + if (lock.try_lock()) { + *_aidl_return = false; + lock.unlock(); + } else { + *_aidl_return = true; + } break; default: break; @@ -73,31 +80,27 @@ constexpr const char *FM_FREQ_SEEK = case SetType::SET_TYPE_FM_SEARCH_CANCEL: case SetType::SET_TYPE_FM_SPEAKER_ROUTE: NOT_SUPPORTED; + case SetType::SET_TYPE_FM_SEARCH_START: + search_thread = std::thread([this] { + for (int i = 0; i < TRACK_SIZE; i++) { + FileIO::writeline(FM_FREQ_SEEK, "1 " + std::to_string(SYSFS_SPACING * 10)); + int freq = FileIO::readline(FM_FREQ_CTL); + if (std::find(freqs_list.begin(), freqs_list.end(), freq) != freqs_list.end()) continue; + freqs_list.push_back(freq); + } + lock.unlock(); + }); + break; default: break; }; - lock.unlock(); + if (type != SetType::SET_TYPE_FM_SEARCH_START) lock.unlock(); return ::ndk::ScopedAStatus::ok(); } -static inline bool vector_contains(const std::vector vec, - const int search) { - for (auto i : vec) { - if (i == search) - return true; - } - return false; -} - ::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(SYSFS_SPACING * 10)); - int freq = FileIO::readline(FM_FREQ_CTL); - if (vector_contains(*_aidl_return, freq)) - continue; - _aidl_return->push_back(freq); - } + *_aidl_return = freqs_list; lock.unlock(); return ::ndk::ScopedAStatus::ok(); } diff --git a/universal7885-common/apps/aidl-support/fm/default/FMSupport.h b/universal7885-common/apps/aidl-support/fm/default/FMSupport.h index 44ed965..671a5d5 100644 --- a/universal7885-common/apps/aidl-support/fm/default/FMSupport.h +++ b/universal7885-common/apps/aidl-support/fm/default/FMSupport.h @@ -17,12 +17,15 @@ #include #include +#include namespace aidl::vendor::eureka::hardware::fmradio { struct FMSupport : public BnFMDevControl { public: - FMSupport() = default; + FMSupport(void) { + index = 0; + }; // Methods from aidl::vendor::eureka::hardware::fmradio::IFMRadio follow. ::ndk::ScopedAStatus open(void) override; ::ndk::ScopedAStatus getValue(GetType type, int *_aidl_return) override; @@ -31,5 +34,8 @@ public: ::ndk::ScopedAStatus close(void) override; private: std::timed_mutex lock; + std::thread search_thread; + std::vector freqs_list; + int index; }; } // namespace aidl::vendor::eureka::hardware::fmradio