/* * * Copyright (c) 2022 Project CHIP Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "OTAHelper.h" #include #include #include #include #include #include #include #include #include #include #include using namespace chip::DeviceLayer; using namespace chip; class CustomOTARequestorDriver : public DeviceLayer::ExtendedOTARequestorDriver { public: bool CanConsent() override; }; namespace { DefaultOTARequestor gRequestorCore; DefaultOTARequestorStorage gRequestorStorage; CustomOTARequestorDriver gRequestorUser; BDXDownloader gDownloader; OTAImageProcessorImpl gImageProcessor; chip::Optional gRequestorCanConsent; static chip::ota::UserConsentState gUserConsentState = chip::ota::UserConsentState::kUnknown; chip::ota::DefaultOTARequestorUserConsent gUserConsentProvider; } // namespace bool CustomOTARequestorDriver::CanConsent() { return gRequestorCanConsent.ValueOr(DeviceLayer::ExtendedOTARequestorDriver::CanConsent()); } extern "C" void QueryImageCmdHandler() { ChipLogProgress(DeviceLayer, "Calling QueryImageCmdHandler"); PlatformMgr().ScheduleWork([](intptr_t) { GetRequestorInstance()->TriggerImmediateQuery(); }); } extern "C" void ApplyUpdateCmdHandler() { ChipLogProgress(DeviceLayer, "Calling ApplyUpdateCmdHandler"); PlatformMgr().ScheduleWork([](intptr_t) { GetRequestorInstance()->ApplyUpdate(); }); } extern "C" void NotifyUpdateAppliedHandler(uint32_t version) { ChipLogProgress(DeviceLayer, "NotifyUpdateApplied"); PlatformMgr().ScheduleWork([](intptr_t) { GetRequestorInstance()->NotifyUpdateApplied(); }); } extern "C" void BkQueryImageCmdHandler(char * pcWriteBuffer, int xWriteBufferLen, int argc, char ** argv) { uint32_t dwLoop = 0; uint32_t nodeId = 0; uint32_t fabricId = 0; char cmd0 = 0; char cmd1 = 0; for (dwLoop = 0; dwLoop < argc; dwLoop++) { ChipLogProgress(DeviceLayer, "QueryImageArgument %d = %s\r\n", dwLoop + 1, argv[dwLoop]); } if (argc == 3) { cmd0 = argv[1][0] - 0x30; cmd1 = argv[1][1] - 0x30; nodeId = (uint32_t) (cmd0 * 10 + cmd1); cmd0 = argv[2][0] - 0x30; cmd1 = argv[2][1] - 0x30; fabricId = (uint32_t) (cmd0 * 10 + cmd1); ChipLogProgress(DeviceLayer, "nodeId %lu,fabricId %lu\r\n", nodeId, fabricId); } else { ChipLogProgress(DeviceLayer, "cmd param error "); return; } QueryImageCmdHandler(); ChipLogProgress(DeviceLayer, "QueryImageCmdHandler begin"); } extern "C" void BkApplyUpdateCmdHandler(char * pcWriteBuffer, int xWriteBufferLen, int argc, char ** argv) { ApplyUpdateCmdHandler(); ChipLogProgress(DeviceLayer, "ApplyUpdateCmdHandler send request"); } extern "C" void BkNotifyUpdateApplied(char * pcWriteBuffer, int xWriteBufferLen, int argc, char ** argv) { uint32_t dwLoop = 0; uint32_t version = 0; char cmd0 = 0; char cmd1 = 0; for (dwLoop = 0; dwLoop < argc; dwLoop++) { ChipLogProgress(DeviceLayer, "NotifyUpdateApplied %d = %s\r\n", dwLoop + 1, argv[dwLoop]); } if (argc == 2) { cmd0 = argv[1][0] - 0x30; cmd1 = argv[1][1] - 0x30; version = (uint32_t) (cmd0 * 10 + cmd1); ChipLogProgress(DeviceLayer, "version %lu \r\n", version); } else { ChipLogProgress(DeviceLayer, "cmd param error "); return; } NotifyUpdateAppliedHandler(version); ChipLogProgress(DeviceLayer, "NotifyUpdateApplied send request"); } static void InitOTARequestorHandler(System::Layer * systemLayer, void * appState) { // Initialize and interconnect the Requestor and Image Processor objects -- START SetRequestorInstance(&gRequestorCore); gRequestorStorage.Init(Server::GetInstance().GetPersistentStorage()); // Set server instance used for session establishment gRequestorCore.Init(Server::GetInstance(), gRequestorStorage, gRequestorUser, gDownloader); gImageProcessor.SetOTADownloader(&gDownloader); // Connect the Downloader and Image Processor objects gDownloader.SetImageProcessorDelegate(&gImageProcessor); gRequestorUser.Init(&gRequestorCore, &gImageProcessor); if (gUserConsentState != chip::ota::UserConsentState::kUnknown) { gUserConsentProvider.SetUserConsentState(gUserConsentState); gRequestorUser.SetUserConsentDelegate(&gUserConsentProvider); } // Initialize and interconnect the Requestor and Image Processor objects -- END } void OTAHelpers::InitOTARequestor() { chip::DeviceLayer::SystemLayer().StartTimer(chip::System::Clock::Seconds32(kInitOTARequestorDelaySec), InitOTARequestorHandler, nullptr); }