blob: aee6f8fc13791481d3f95f6bf8cb93d6cf0b472f [file] [log] [blame]
/*
*
* Copyright (c) 2021 Project CHIP Authors
* All rights reserved.
*
* 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.
*/
/* This file contains the declaration for the OTARequestorDriver class, an interface
* that abstracts the OTA-related business logic out of the Requestor functionality in
* the Matter SDK. Applications implementing the OTA Requestor functionality must include
* this file.
*/
#pragma once
#include <app-common/zap-generated/cluster-objects.h>
#include <protocols/bdx/BdxMessages.h>
#include <system/SystemClock.h>
namespace chip {
// The set of parameters needed for starting a BDX download.
struct UpdateDescription
{
NodeId nodeId;
CharSpan fileDesignator;
uint32_t softwareVersion;
CharSpan softwareVersionStr;
ByteSpan updateToken;
bool userConsentNeeded;
ByteSpan metadataForRequestor;
};
enum class UpdateNotFoundReason
{
kBusy,
kNotAvailable,
kUpToDate,
};
// The reasons for why the OTA Requestor has entered idle state
enum class IdleStateReason
{
kUnknown,
kIdle,
kInvalidSession,
};
// The current selected OTA Requestor timer to be running
enum class SelectedTimer
{
kPeriodicQueryTimer,
kWatchdogTimer,
};
// Interface class to abstract the OTA-related business logic. Each application
// must implement this interface. All calls must be non-blocking unless stated otherwise
class OTARequestorDriver
{
public:
using ProviderLocationType = app::Clusters::OtaSoftwareUpdateRequestor::Structs::ProviderLocation::Type;
virtual ~OTARequestorDriver() = default;
/// Return true if the device has the ability to ask the user for consent before downloading a software image
virtual bool CanConsent() = 0;
/// Return maximum supported download block size
virtual uint16_t GetMaxDownloadBlockSize() { return 1024; }
/// Set maximum supported download block size
virtual void SetMaxDownloadBlockSize(uint16_t maxDownloadBlockSize) = 0;
/// Called when OTA Requestor has exited the Idle state for which the driver may need to take various actions
virtual void HandleIdleStateExit() = 0;
// Called when the OTA Requestor has entered the Idle state for which the driver may need to take various actions
virtual void HandleIdleStateEnter(IdleStateReason reason) = 0;
/// Called when the latest query found a software update
virtual void UpdateAvailable(const UpdateDescription & update, System::Clock::Seconds32 delay) = 0;
/// Called when the latest query did not find any software update
virtual CHIP_ERROR UpdateNotFound(UpdateNotFoundReason reason, System::Clock::Seconds32 delay) = 0;
/// Called when the download of a new software image has finished
virtual void UpdateDownloaded() = 0;
/// Called when the current software update can be applied
virtual void UpdateConfirmed(System::Clock::Seconds32 delay) = 0;
/// Called when the requestor shall ask again before applying the current software update
virtual void UpdateSuspended(System::Clock::Seconds32 delay) = 0;
/// Called when the current software update should be discontinued
virtual void UpdateDiscontinued() = 0;
/// Called when the current software update has been cancelled by the local application
virtual void UpdateCancelled() = 0;
/// Inform the driver that the device commissioning has completed
virtual void OTACommissioningCallback() = 0;
/// Driver portion of the logic for processing the AnnounceOTAProviders command
virtual void
ProcessAnnounceOTAProviders(const ProviderLocationType & providerLocation,
app::Clusters::OtaSoftwareUpdateRequestor::OTAAnnouncementReason announcementReason) = 0;
/// Direct the driver to trigger the QueryImage command. The driver may choose to execute some internal
/// logic and will then call an OTARequestorInterface API to actually send the command. The purpose of this
/// function is to allow implementation-specific logic (such as possibly cancelling an ongoing update)
/// to be executed before triggering the image update process
virtual void SendQueryImage() = 0;
// Driver picks the OTA Provider that should be used for the next query and update. The Provider is picked according to
// the driver's internal logic such as, for example, traversing the default providers list.
// Returns true if there is a Provider available for the next query, returns false otherwise.
// @param[out] listExhausted - set to TRUE if the list of providers has been traversed until the end and has looped
// back to the beginning.
virtual bool GetNextProviderLocation(ProviderLocationType & providerLocation, bool & listExhausted) = 0;
};
} // namespace chip