blob: 47573ba348fd7825945ef7a31c711c5450ee311e [file] [log] [blame]
/*
*
* Copyright (c) 2020 Project CHIP Authors
* Copyright (c) 2018 Nest Labs, Inc.
*
* 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.
*/
/**
* @file
* Defines events used by the chip Device Layer to signal actions
* or changes in device state.
*/
#pragma once
#include <stdint.h>
#include <inet/IPAddress.h>
#include <lib/core/DataModelTypes.h>
namespace chip {
namespace DeviceLayer {
namespace DeviceEventType {
enum
{
kFlag_IsPublic = 0x8000,
kFlag_IsPlatformSpecific = 0x4000,
kFlag_Reserved1 = 0x2000,
kFlag_Reserved2 = 0x1000,
kMaxEventNum = 0x0FFF,
};
/**
* Event Type Ranges
*
* Defines numeric ranges for event types based on their visibility to the application,
* an whether or not they are specific to a particular platform adaptation.
*/
enum EventTypeRanges
{
/**
* Public Event Range
*
* Denotes a range of event types that are publicly visible to applications. Events in this
* range a generic to all platforms.
*/
kRange_Public = kFlag_IsPublic,
/**
* Public, Platform-specific Event Range
*
* Denotes a range of platform-specific event types that are publicly visible to applications.
*/
kRange_PublicPlatformSpecific = kFlag_IsPublic | kFlag_IsPlatformSpecific,
/**
* Internal Event Range
*
* Denotes a range of event types that are internal to the chip Device Layer. Events in this
* range a generic to all platforms.
*/
kRange_Internal = 0,
/**
* Internal, Platform-specific Event Range
*
* Denotes a range of platform-specific event types that are internal to the chip Device Layer.
*/
kRange_InternalPlatformSpecific = kFlag_IsPlatformSpecific,
};
inline bool IsPublic(uint16_t eventType)
{
return (eventType & kFlag_IsPublic) != 0;
}
inline bool IsInternal(uint16_t eventType)
{
return (eventType & kFlag_IsPublic) == 0;
}
inline bool IsPlatformSpecific(uint16_t eventType)
{
return (eventType & kFlag_IsPlatformSpecific) != 0;
}
inline bool IsPlatformGeneric(uint16_t eventType)
{
return (eventType & kFlag_IsPlatformSpecific) == 0;
}
/**
* Public Event Types
*
* Enumerates event types that are visible to the application and common across
* all platforms.
*/
enum PublicEventTypes
{
/**
* WiFi Connectivity Change
*
* Signals a change in connectivity of the device's WiFi station interface.
*/
kWiFiConnectivityChange = kRange_Public,
/**
* Thread Connectivity Change
*
* Signals a change in connectivity of the device's Thread interface.
*/
kThreadConnectivityChange,
/**
* Internet Connectivity Change
*
* Signals a change in the device's ability to communicate via the Internet.
*/
kInternetConnectivityChange,
/**
* Service Connectivity Change
*
* Signals a change in the device's ability to communicate with a chip-enabled service.
*/
kServiceConnectivityChange,
/**
* Service Provisioning Change
*
* Signals a change to the device's service provisioning state.
*/
kServiceProvisioningChange,
/**
* Time Sync Change
*
* Signals a change to the device's real time clock synchronization state.
*/
kTimeSyncChange,
/**
* SED Interval Change
*
* Signals a change to the sleepy end device interval.
*/
kICDPollingIntervalChange,
/**
* CHIPoBLE Connection Established
*
* Signals that an external entity has established a new CHIPoBLE connection with the device.
*/
kCHIPoBLEConnectionEstablished,
/**
* CHIPoBLE Connection Closed
*
* Signals that an external entity has closed existing CHIPoBLE connection with the device.
*/
kCHIPoBLEConnectionClosed,
/**
* Thread State Change
*
* Signals that a state change has occurred in the Thread stack.
*/
kThreadStateChange,
/**
* Thread Interface State Change
*
* Signals that the state of the Thread network interface has changed.
*/
kThreadInterfaceStateChange,
/**
* chip-over-BLE (CHIPoBLE) Advertising Change
*
* Signals that the state of CHIPoBLE advertising has changed.
*/
kCHIPoBLEAdvertisingChange,
/**
* IP address availability - either ipv4 or ipv6 addresses assigned to the underlying
* wifi/ethernet interface.
*/
kInterfaceIpAddressChanged,
/**
* Signals that the commissioning window has opened or closed.
*/
kCommissioningWindowStatusChanged,
/**
* Commissioning has completed by a call to the general commissioning cluster command.
*/
kCommissioningComplete,
/**
* Signals that the fail-safe timer expired before the CommissioningComplete command was
* successfully invoked.
*/
kFailSafeTimerExpired,
/**
* Signals that the fail-safe state changed (Armed/Disarmed)
*/
kFailSafeStateChanged,
/**
*
*/
kOperationalNetworkEnabled,
/**
* Signals that DNS-SD has been initialized and is ready to operate.
*/
kDnssdInitialized,
/**
* Signals that DNS-SD backend was restarted and services must be published again.
*/
kDnssdRestartNeeded,
/**
* Signals that bindings were updated.
*/
kBindingsChangedViaCluster,
/**
* Signals that the state of the OTA engine changed.
*/
kOtaStateChanged,
/**
* Server initialization has completed.
*
* Signals that all server components have been initialized and the node is ready to establish
* connections with other nodes. This event can be used to trigger on-boot actions that require
* sending messages to other nodes.
*/
kServerReady,
/**
* TODO ICD: kChipMsgSentEvent and kChipMsgRxEventHandled should be InternalEventTypes.
* However the ICD manager leverages those events and its event handler is registered as an application
* event handler.
* ICDEventManager will have to expose 'ICDEventHandler' publicly to 'DispatchEventToDeviceLayer'.
*/
/**
* An Exchange Context sent a message.
* This event contains a with MessageSent structure.
*/
kChipMsgSentEvent,
/**
* An Exchange Context that was waiting for a response is no longer waiting for it.
* This event can occur due to any of the following:
* - A response message was received.
* - An exchange context timed out waiting for a response.
* - The exchange context was closed while a response was expected.
*
* This event contains an RxEventContext structure.
*/
kChipMsgRxEventHandled,
/**
* This event is used to sync the ICD with any Reliable Message exchange
* expecting an ack. The ICD shall stay in active Mode
* until the Reliable Message exchange post this event again
* informing the ICD that it is no longer awaiting the ack.
*
* This event contains an AckSync structure.
*/
kICDMsgAckSyncEvent,
/**
* An application event occured that should wake up the system/device
*/
kAppWakeUpEvent,
};
/**
* Internal Event Types
*
* Enumerates event types that are internal to the chip Device Layer, but common across
* all platforms.
*/
enum InternalEventTypes
{
kEventTypeNotSet = kRange_Internal,
kNoOp,
kCallWorkFunct,
kChipLambdaEvent,
kChipSystemLayerEvent,
kCHIPoBLESubscribe,
kCHIPoBLEUnsubscribe,
kCHIPoBLEWriteReceived,
kCHIPoBLEIndicateConfirm,
kCHIPoBLEConnectionError,
kCHIPoBLENotifyConfirm
};
static_assert(kEventTypeNotSet == 0, "kEventTypeNotSet must be defined as 0");
} // namespace DeviceEventType
/**
* Connectivity Change
*
* Describes a change in some aspect of connectivity associated with a chip device.
*/
enum ConnectivityChange
{
kConnectivity_NoChange = 0,
kConnectivity_Established = 1,
kConnectivity_Lost = -1
};
enum class InterfaceIpChangeType
{
kIpV4_Assigned,
kIpV4_Lost,
kIpV6_Assigned,
kIpV6_Lost,
};
/**
* Activity Change
*
* Describes a change in some activity associated with a chip device.
*/
enum ActivityChange
{
kActivity_NoChange = 0,
kActivity_Started = 1,
kActivity_Stopped = -1,
};
enum OtaState
{
kOtaSpaceAvailable = 0,
/**
* This state indicates that Node is currently downloading a software update.
*/
kOtaDownloadInProgress,
/**
* This state indicates that Node has successfully downloaded a software update.
*/
kOtaDownloadComplete,
/**
* This state indicates that Node has failed to download a software update.
*/
kOtaDownloadFailed,
/**
* This state indicates that Node has aborted the download of a software update.
*/
kOtaDownloadAborted,
/**
* This state indicate that Node is currently in the process of verifying and applying a software update.
*/
kOtaApplyInProgress,
/**
* This state indicates that Node has successfully applied a software update.
*/
kOtaApplyComplete,
/**
* This state indicates that Node has failed to apply a software update.
*/
kOtaApplyFailed,
};
inline ConnectivityChange GetConnectivityChange(bool prevState, bool newState)
{
if (prevState == newState)
return kConnectivity_NoChange;
if (newState)
return kConnectivity_Established;
return kConnectivity_Lost;
}
/**
* A pointer to a function that performs work asynchronously.
*/
typedef void (*AsyncWorkFunct)(intptr_t arg);
} // namespace DeviceLayer
} // namespace chip
/* Include a header file containing platform-specific event definitions.
*/
#ifdef EXTERNAL_CHIPDEVICEPLATFORMEVENT_HEADER
#include EXTERNAL_CHIPDEVICEPLATFORMEVENT_HEADER
#elif defined(CHIP_DEVICE_LAYER_TARGET)
#define CHIPDEVICEPLATFORMEVENT_HEADER <platform/CHIP_DEVICE_LAYER_TARGET/CHIPDevicePlatformEvent.h>
#include CHIPDEVICEPLATFORMEVENT_HEADER
#endif // defined(CHIP_DEVICE_LAYER_TARGET)
#include <ble/BleConfig.h>
#include <inet/InetInterface.h>
#include <lib/support/LambdaBridge.h>
#include <system/SystemEvent.h>
#include <system/SystemLayer.h>
#include <system/SystemPacketBuffer.h>
namespace chip {
namespace DeviceLayer {
/**
* Represents a chip Device Layer event.
*/
struct ChipDeviceEvent final
{
uint16_t Type;
union
{
ChipDevicePlatformEvent Platform;
LambdaBridge LambdaEvent;
struct
{
AsyncWorkFunct WorkFunct;
intptr_t Arg;
} CallWorkFunct;
struct
{
ConnectivityChange Result;
} WiFiConnectivityChange;
struct
{
ConnectivityChange Result;
} ThreadConnectivityChange;
struct
{
ConnectivityChange IPv4;
ConnectivityChange IPv6;
// WARNING: There used to be `char address[INET6_ADDRSTRLEN]` here and it is
// deprecated/removed since it was too large and only used for logging.
// Consider not relying on ipAddress field either since the platform
// layer *does not actually validate* that the actual internet is reachable
// before issuing this event *and* there may be multiple addresses
// (especially IPv6) so it's recommended to use `ChipDevicePlatformEvent`
// instead and do something that is better for your platform.
chip::Inet::IPAddress ipAddress;
} InternetConnectivityChange;
struct
{
struct
{
ConnectivityChange Result;
} Overall;
struct
{
ConnectivityChange Result;
} ViaThread;
} ServiceConnectivityChange;
struct
{
ConnectivityChange Result;
} ServiceSubscriptionStateChange;
struct
{
bool IsMemberOfFabric;
} FabricMembershipChange;
struct
{
bool IsServiceProvisioned;
bool ServiceConfigUpdated;
} ServiceProvisioningChange;
struct
{
bool IsPairedToAccount;
} AccountPairingChange;
struct
{
bool IsTimeSynchronized;
} TimeSyncChange;
struct
{
uint64_t PeerNodeId;
uint16_t SessionKeyId;
uint8_t SessionType;
bool IsCommissioner;
} SessionEstablished;
struct
{
BLE_CONNECTION_OBJECT ConId;
} CHIPoBLESubscribe;
struct
{
BLE_CONNECTION_OBJECT ConId;
} CHIPoBLEUnsubscribe;
struct
{
BLE_CONNECTION_OBJECT ConId;
chip::System::PacketBuffer * Data;
} CHIPoBLEWriteReceived;
struct
{
BLE_CONNECTION_OBJECT ConId;
} CHIPoBLEIndicateConfirm;
struct
{
BLE_CONNECTION_OBJECT ConId;
CHIP_ERROR Reason;
} CHIPoBLEConnectionError;
struct
{
BLE_CONNECTION_OBJECT ConId;
} CHIPoBLENotifyConfirm;
struct
{
bool RoleChanged : 1;
bool AddressChanged : 1;
bool NetDataChanged : 1;
bool ChildNodesChanged : 1;
struct
{
uint32_t Flags;
} OpenThread;
} ThreadStateChange;
struct
{
ActivityChange Result;
} CHIPoBLEAdvertisingChange;
struct
{
InterfaceIpChangeType Type;
} InterfaceIpAddressChanged;
struct
{
uint64_t nodeId;
FabricIndex fabricIndex;
} CommissioningComplete;
struct
{
FabricIndex fabricIndex;
} BindingsChanged;
struct
{
FabricIndex fabricIndex;
bool addNocCommandHasBeenInvoked;
bool updateNocCommandHasBeenInvoked;
} FailSafeTimerExpired;
struct
{
bool armed;
} FailSafeState;
struct
{
bool open;
} CommissioningWindowStatus;
struct
{
// TODO(cecille): This should just specify wifi or thread since we assume at most 1.
int network;
} OperationalNetwork;
struct
{
OtaState newState;
} OtaStateChanged;
struct
{
bool ExpectResponse;
} MessageSent;
struct
{
/*
* wasReceived is only true when the event was triggered by a response message reception.
* See the brief of kChipMsgRxEventHandled, above in this file, for additional details.
*/
bool wasReceived;
bool clearsExpectedResponse;
} RxEventContext;
struct
{
/*
* Set to true when a Reliable Message Context is awaiting for a ack to a message sent
* Set to false when the Reliable Message Context is no longer awaiting for a ack
*/
bool awaitingAck;
} AckSync;
};
void Clear() { memset(this, 0, sizeof(*this)); }
bool IsPublic() const { return DeviceEventType::IsPublic(Type); }
bool IsInternal() const { return DeviceEventType::IsInternal(Type); }
bool IsPlatformSpecific() const { return DeviceEventType::IsPlatformSpecific(Type); }
bool IsPlatformGeneric() const { return DeviceEventType::IsPlatformGeneric(Type); }
};
} // namespace DeviceLayer
} // namespace chip