# AVS SDK DEV base on AVS SDK 1.2.6.0 ## 1. 说明 基于 AVS SDK 的修改说明 ## 2. 开发内容 ### 2.1. 通信模块 引入通信模块 **transport** #### 2.1.1. 源码相关改动 * SampleApp/CMakeLists.txt ```text add_subdirectory("Authorization") +add_subdirectory("transport") ``` * SampleApp/src 以及 include/SampleApp 下面几个文件 详情参见git diff #### 2.1.2. transport 模块 具体参见源码:SampleApp/transport ### 2.2. 添加与config_app交互以及对应的业务逻辑执行代码 具体代码参见:UserInputManager.cpp,部分代码如下 ```c++ #define CMD_KEY "cmd" #define CMD_VAL_BUTTON "button" #define CMD_VAL_NET "net" #define CMD_VAL_FACTORYRESET "factoryreset" #define CMD_VAL_SET_LIGHTING "set_lighting" #define CMD_VAL_SET_SPEAKER_VOL "set_speaker_volume" #define CMD_VAL_SET_ALERT_VOL "set_alert_volume" #define CMD_VAL_SET_UX_LEN "set_ux_led" #define CMD_DATA_KEY "data" #define CMD_DATA_VALUE_KEY "value" void UserInputManager::OnCfgMessage(std::shared_ptr buffer) { } ``` ### 2.3. 添加音量设置接口 接口形式如下,详细内容参见源码 ```c++ // InteractionManager.h/cpp void InteractionManager::setVolume(avsCommon::sdkInterfaces::ChannelVolumeInterface::Type type, int8_t volume) { } ``` ### 2.4. 添加认证接口给LWA 参见源码 AuthInputManager.h ### 2.5. 添加UI执行模块 引入灯效与音效处理 **ui** #### 2.5.1. 源码相关改动 * SampleApp/CMakeLists.txt ```text add_subdirectory("transport") +add_subdirectory("ui") ``` #### 2.5.2. 代码 参见 SampleApp/ui 部分代码 ### 2.6. 导入音效文件 参见 Resources/Audio/include/Audio/Data 目录下面文件 ### 2.7. DSN 处理 DSN使用MAC地址,参见文件: srcs/AVSCommon/Utils/src/DeviceInfo.cpp 部分代码如下: ```c++ const std::string DEFAULT_DSN = "avs_def_dsn"; const std::string DEFAULT_IF = "wlan0"; static std::string GetAvaliableMac() { } ``` ### 2.8. 导入灯效驱动文件 #### 2.8.1. 导入driver到内核 详情参见文件 <<"led drivers && hal.pdf">> #### 2.8.2. 导入hal文件以及解决编译问题 详情参见文件 <<"led drivers && hal.pdf">> 以及 ledhal模块 ### 2.9. 唤醒词切换 #### 2.9.1. 相关源码文件修改 * srcs/extension/avs-cpp-sdk/KWD/AmazonLite/src/PryonLiteKeywordDetector.cpp * srcs/extension/avs-cpp-sdk/KWD/AmazonLite/include/AmazonLite/PryonLiteKeywordDetector.h * srcs/extension/avs-cpp-sdk/KWD/KWDProvider/src/PryonLiteRegistration.cpp * srcs/SampleApp/include/SampleApp/InteractionManager.h * srcs/SampleApp/include/SampleApp/SampleApplication.h * srcs/SampleApp/src/InteractionManager.cpp * srcs/SampleApp/src/SampleApplication.cpp * srcs/shared/KWD/acsdkKWDProvider/src/KeywordDetectorProvider.cpp * srcs/shared/KWD/acsdkKWDProvider/include/acsdkKWDProvider/KWDProvider/KeywordDetectorProvider.h #### 2.9.2. 新增 添加 管理类 KDWModelSel,部分代码如下: ```c++ class KDWModelSel { public: KDWModelSel() { #ifdef KWD model_map_["ja-JP"] = "X.ja-JP.alexa.bin"; model_map_["en-US"] = "X.en-CA+en-US.alexa.bin"; #endif } std::unique_ptr UpdateModel( const std::string& local) { #ifdef KWD ACSDK_INFO(alexaClientSDK::avsCommon::utils::logger::LogEntry("KDWModelSel", "UpdateModel").d("local", local)); return alexaClientSDK::kwd::KeywordDetectorProvider::updateKWDModel(suffix_ + model_map_[local]); #endif return nullptr; } private: const std::string suffix_ = "/data/avs/wakeword-models/x1f8/"; std::unordered_map model_map_; }; ``` ### 2.10. 添加 onNotificationReceived 接口 添加Notification接口以及相关的业务功能 ```c++ void onNotificationReceived() override; ``` ### 2.11. 添加数据库模块 参见源码: db_wrapper.h/cpp ### 2.12. 程序启动音量处理 部分代码 ```c++ std::string vol_str; bool ret = db_wrapper_->Load(::avs::db::USER_DB_KEY_SPEAKER_VOL, vol_str); if (ret) { m_interactionManager->setVolume(ChannelVolumeInterface::Type::AVS_SPEAKER_VOLUME, std::atoi(vol_str.c_str())); } else { // database has val,use config file int vol_int; alexaClientSDK::avsCommon::utils::configuration::ConfigurationNode::getRoot()[SPEAKER_MANAGER_CAPABILITY_AGENT] .getInt("defaultSpeakerVolume", &vol_int, 80); m_interactionManager->setVolume(ChannelVolumeInterface::Type::AVS_SPEAKER_VOLUME, vol_int); } ret = db_wrapper_->Load(::avs::db::USER_DB_KEY_ALERT_VOL, vol_str); if (ret) { m_interactionManager->setVolume(ChannelVolumeInterface::Type::AVS_ALERTS_VOLUME, std::atoi(vol_str.c_str())); } else { // database has val,use config file int vol_int; alexaClientSDK::avsCommon::utils::configuration::ConfigurationNode::getRoot()[SPEAKER_MANAGER_CAPABILITY_AGENT] .getInt("defaultAlertsVolume", &vol_int, 80); m_interactionManager->setVolume(ChannelVolumeInterface::Type::AVS_ALERTS_VOLUME, vol_int); } ``` ### 2.13. DND状态存入数据库与开机加载 ```c++ auto dnd = m_client->getSettingsManager()->getValue(); ACSDK_INFO(LX("DNS").d("enable", dnd.second)); ::avs::ui::UiExector::Instance()->SetDND(dnd.second); ``` ### 2.14. 添加解绑功能 支持app解绑、按键解绑、云端解绑,关于云端解绑,修改的源文件有: * srcs/ApplicationUtilities/DefaultClient/src/DefaultClient.cpp * srcs/ApplicationUtilities/DefaultClient/include/DefaultClient/DefaultClient.h * srcs/AVSCommon/SDKInterfaces/include/AVSCommon/SDKInterfaces/UserInactivityMonitorObserverInterface.h * srcs/capabilities/MultiRoomMusic/acsdkMultiRoomMusic/include/acsdkMultiRoomMusic/MRMCapabilityAgent.h * srcs/CapabilityAgents/System/src/UserInactivityMonitor.cpp * srcs/CapabilityAgents/System/include/System/UserInactivityMonitor.h ### 2.15. 添加编译和git信息 ```text execute_process( COMMAND git log -1 --format=%h WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} OUTPUT_VARIABLE GIT_VERSION ) string (REGEX REPLACE "[\n\t\r]" "" GIT_VERSION ${GIT_VERSION}) add_definitions( -DGIT_VERSION=\"${GIT_VERSION}\") string(TIMESTAMP COMPILE_TIME "%Y%m%d %H%M%S") add_definitions( -DCOMPILE_TIME=\"${COMPILE_TIME}\") ``` ```c++ #if defined(GIT_VERSION) && defined(COMPILE_TIME) ACSDK_CRITICAL(LX("SampleApplication").d("version", GIT_VERSION).d("build", COMPILE_TIME)); #endif ```