From b9c6e96e83c463ec1bb81d3924d9c713e788899c Mon Sep 17 00:00:00 2001 From: roynatech2544 Date: Fri, 21 Oct 2022 22:35:09 +0900 Subject: [PATCH] universal7885: fm-aidl: Handle middle states for manual freq setting Also move FM support instance to vector cached --- .../apps/aidl-support/fm/default/Android.bp | 1 + .../aidl-support/fm/default/FMDevControl.cpp | 12 ++++++++++ .../aidl-support/fm/default/FMDevControl.h | 3 +++ .../aidl-support/fm/default/FMSupport.cpp | 22 +++++++++++++++---- .../apps/aidl-support/fm/default/FMSupport.h | 4 +++- .../aidl-support/fm/default/MiddleState.cpp | 14 ++++++++++++ .../aidl-support/fm/default/MiddleState.h | 12 ++++++++++ 7 files changed, 63 insertions(+), 5 deletions(-) create mode 100644 universal7885-common/apps/aidl-support/fm/default/MiddleState.cpp create mode 100644 universal7885-common/apps/aidl-support/fm/default/MiddleState.h diff --git a/universal7885-common/apps/aidl-support/fm/default/Android.bp b/universal7885-common/apps/aidl-support/fm/default/Android.bp index feb6c9c..1f0bdaa 100644 --- a/universal7885-common/apps/aidl-support/fm/default/Android.bp +++ b/universal7885-common/apps/aidl-support/fm/default/Android.bp @@ -11,6 +11,7 @@ cc_binary { srcs: [ "FMSupport.cpp", "FMDevControl.cpp", + "MiddleState.cpp", "service.cpp", ], defaults: [ diff --git a/universal7885-common/apps/aidl-support/fm/default/FMDevControl.cpp b/universal7885-common/apps/aidl-support/fm/default/FMDevControl.cpp index 2ecd61e..c3c3dfb 100644 --- a/universal7885-common/apps/aidl-support/fm/default/FMDevControl.cpp +++ b/universal7885-common/apps/aidl-support/fm/default/FMDevControl.cpp @@ -54,11 +54,21 @@ namespace aidl::vendor::eureka::hardware::fmradio { break; case GetType::GET_TYPE_FM_BEFORE_CHANNEL: if (index > 0) index -= 1; + if (kMiddleState != nullptr) { + index = kMiddleState->first; + delete kMiddleState; + kMiddleState = nullptr; + } fm_radio_slsi::set_frequency(fd, freqs_list[index]); *_aidl_return = freqs_list[index]; break; case GetType::GET_TYPE_FM_NEXT_CHANNEL: if (index < freqs_list.size() - 1) index += 1; + if (kMiddleState != nullptr) { + index = kMiddleState->second; + delete kMiddleState; + kMiddleState = nullptr; + } fm_radio_slsi::set_frequency(fd, freqs_list[index]); *_aidl_return = freqs_list[index]; break; @@ -86,6 +96,8 @@ namespace aidl::vendor::eureka::hardware::fmradio { switch (type) { case SetType::SET_TYPE_FM_FREQ: fm_radio_slsi::set_frequency(fd, value); + if (std::find(freqs_list.begin(), freqs_list.end(), value) == freqs_list.end()) + kMiddleState = saveMiddleState(value, freqs_list); break; case SetType::SET_TYPE_FM_MUTE: fm_radio_slsi::set_mute(fd, value); diff --git a/universal7885-common/apps/aidl-support/fm/default/FMDevControl.h b/universal7885-common/apps/aidl-support/fm/default/FMDevControl.h index e3cb025..9047b02 100644 --- a/universal7885-common/apps/aidl-support/fm/default/FMDevControl.h +++ b/universal7885-common/apps/aidl-support/fm/default/FMDevControl.h @@ -19,6 +19,8 @@ #include #include +#include "MiddleState.h" + namespace aidl::vendor::eureka::hardware::fmradio { struct FMDevControl : public BnFMDevControl { @@ -38,5 +40,6 @@ struct FMDevControl : public BnFMDevControl { std::timed_mutex lock; std::thread search_thread; std::vector freqs_list; + middlestate_t *kMiddleState; }; } // 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 aa31941..bbb541b 100644 --- a/universal7885-common/apps/aidl-support/fm/default/FMSupport.cpp +++ b/universal7885-common/apps/aidl-support/fm/default/FMSupport.cpp @@ -43,12 +43,24 @@ constexpr const char *FM_FREQ_SEEK = FM_SYSFS_BASE "/radio_freq_seek"; case GetType::GET_TYPE_FM_RMSSI: NOT_SUPPORTED; case GetType::GET_TYPE_FM_BEFORE_CHANNEL: - FileIO::writeline(FM_FREQ_SEEK, "0 " + std::to_string(SYSFS_SPACING * 10)); - *_aidl_return = FileIO::readline(FM_FREQ_CTL); + if (index > 0) index -= 1; + if (kMiddleState != nullptr) { + index = kMiddleState->first; + delete kMiddleState; + kMiddleState = nullptr; + } + FileIO::writeline(FM_FREQ_CTL, freqs_list[index]); + *_aidl_return = freqs_list[index]; break; case GetType::GET_TYPE_FM_NEXT_CHANNEL: - FileIO::writeline(FM_FREQ_SEEK, "1 " + std::to_string(SYSFS_SPACING * 10)); - *_aidl_return = FileIO::readline(FM_FREQ_CTL); + if (index < freqs_list.size() - 1) index += 1; + if (kMiddleState != nullptr) { + index = kMiddleState->second; + delete kMiddleState; + kMiddleState = nullptr; + } + FileIO::writeline(FM_FREQ_CTL, freqs_list[index]); + *_aidl_return = freqs_list[index]; break; case GetType::GET_TYPE_FM_SYSFS_IF: *_aidl_return = access(FM_SYSFS_BASE, F_OK); @@ -72,6 +84,8 @@ constexpr const char *FM_FREQ_SEEK = FM_SYSFS_BASE "/radio_freq_seek"; switch (type) { case SetType::SET_TYPE_FM_FREQ: FileIO::writeline(FM_FREQ_CTL, value * 1000); + if (std::find(freqs_list.begin(), freqs_list.end(), value) == freqs_list.end()) + kMiddleState = saveMiddleState(value, freqs_list); break; case SetType::SET_TYPE_FM_MUTE: case SetType::SET_TYPE_FM_VOLUME: diff --git a/universal7885-common/apps/aidl-support/fm/default/FMSupport.h b/universal7885-common/apps/aidl-support/fm/default/FMSupport.h index 671a5d5..78879c7 100644 --- a/universal7885-common/apps/aidl-support/fm/default/FMSupport.h +++ b/universal7885-common/apps/aidl-support/fm/default/FMSupport.h @@ -18,6 +18,7 @@ #include #include +#include "MiddleState.h" namespace aidl::vendor::eureka::hardware::fmradio { @@ -36,6 +37,7 @@ public: std::timed_mutex lock; std::thread search_thread; std::vector freqs_list; - int index; + unsigned int index; + middlestate_t *kMiddleState; }; } // namespace aidl::vendor::eureka::hardware::fmradio diff --git a/universal7885-common/apps/aidl-support/fm/default/MiddleState.cpp b/universal7885-common/apps/aidl-support/fm/default/MiddleState.cpp new file mode 100644 index 0000000..e78aba7 --- /dev/null +++ b/universal7885-common/apps/aidl-support/fm/default/MiddleState.cpp @@ -0,0 +1,14 @@ +#include "MiddleState.h" + +middlestate_t *saveMiddleState(const int value, const std::vector &vec) +{ + unsigned int i; + for (i = 0; i < vec.size() - 1; i++) { + const int first = vec[i] - value; + const int second = vec[i + 1] - value; + if (first * second < 0) + break; + } + + return new middlestate_t {i, i + 1}; +} diff --git a/universal7885-common/apps/aidl-support/fm/default/MiddleState.h b/universal7885-common/apps/aidl-support/fm/default/MiddleState.h new file mode 100644 index 0000000..855fba7 --- /dev/null +++ b/universal7885-common/apps/aidl-support/fm/default/MiddleState.h @@ -0,0 +1,12 @@ +#include + +#pragma once + +struct pair { + unsigned int first; + unsigned int second; +}; + +using middlestate_t = struct pair; + +middlestate_t *saveMiddleState(const int value, const std::vector &vec);