Skip to content

Commit

Permalink
Add ZAP templates to src/app (#3638)
Browse files Browse the repository at this point in the history
* Moved templates out of PR #3464

* fix PR comments

* Moved template to src/app

* Fix PR comments

* Renamed src/app/zap to src/app/zap-templates

* removed CLI define

* Switch to pragma once

* Restyled by whitespace

* Restyled by clang-format

* Restyled by prettier-json

* Restyled by prettier-markdown

Co-authored-by: Restyled.io <[email protected]>
  • Loading branch information
jepenven-silabs and restyled-commits authored Nov 10, 2020
1 parent d652be4 commit c2e5453
Show file tree
Hide file tree
Showing 19 changed files with 663 additions and 0 deletions.
5 changes: 5 additions & 0 deletions src/app/docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,11 @@ Framework including the file you are reading right now.
This directory contains all of the cluster implementations included in the CHIP
ZCL Application Framework.

### <code>/src/app/zap-templates</code>

This directory contains all of the templates and helpers specific to CHIP for
the ZAP tool.

## Public APIs

### Attribute changes
Expand Down
26 changes: 26 additions & 0 deletions src/app/zap-templates/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# ZAP generation templates

## What is this repo?

This directory contains generation templates for ZAP, ZCL Advanced Platform.

**IMPORTANT**: Changes to templates will affect all examples.

# Useful command for CHIP

Run ZAP with UI to configure endpoints and clusters

```
cd ./third_party/zap/repo/
node src-script/zap-start.js --logToStdout --gen ../../../src/app/zap-templates/chip-templates.json
```

Generate files in headless mode

```
cd ./third_party/zap/repo/
node src-script/zap-generate.js -z ./zcl-builtin/silabs/zcl.json -g ../../../src/app/zap-templates/chip-templates.json -i <path to *.zap file> -o <Path to /gen/ folder>
```

For more information please see the documentation under `docs/` in
[ZAP](https://github.com/project-chip/zap)
17 changes: 17 additions & 0 deletions src/app/zap-templates/af-structs.zapt
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{{chip_header}}

// Prevent multiple inclusion
#pragma once

#include <stdint.h>
#include "enums.h"

{{#zcl_structs}}

// Struct for {{label}}
typedef struct _{{asType label}} {
{{#zcl_struct_items}}
{{ident}}{{asUnderlyingType type}} {{asSymbol label}};
{{/zcl_struct_items}}
} {{asUnderlyingType label}};
{{/zcl_structs}}
53 changes: 53 additions & 0 deletions src/app/zap-templates/att-storage.zapt
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
{{chip_header}}

// Prevent multiple inclusion
#pragma once

// Attribute masks modify how attributes are used by the framework
//
// Attribute that has this mask is NOT read-only
#define ATTRIBUTE_MASK_WRITABLE (0x01)
// Attribute that has this mask is saved to a token
#define ATTRIBUTE_MASK_TOKENIZE (0x02)
// Attribute that has this mask has a min/max values
#define ATTRIBUTE_MASK_MIN_MAX (0x04)
// Manufacturer specific attribute
#define ATTRIBUTE_MASK_MANUFACTURER_SPECIFIC (0x08)
// Attribute deferred to external storage
#define ATTRIBUTE_MASK_EXTERNAL_STORAGE (0x10)
// Attribute is singleton
#define ATTRIBUTE_MASK_SINGLETON (0x20)
// Attribute is a client attribute
#define ATTRIBUTE_MASK_CLIENT (0x40)

// Cluster masks modify how clusters are used by the framework
//
// Does this cluster have init function?
#define CLUSTER_MASK_INIT_FUNCTION (0x01)
// Does this cluster have attribute changed function?
#define CLUSTER_MASK_ATTRIBUTE_CHANGED_FUNCTION (0x02)
// Does this cluster have default response function?
#define CLUSTER_MASK_DEFAULT_RESPONSE_FUNCTION (0x04)
// Does this cluster have message sent function?
#define CLUSTER_MASK_MESSAGE_SENT_FUNCTION (0x08)
// Does this cluster have manufacturer specific attribute changed function?
#define CLUSTER_MASK_MANUFACTURER_SPECIFIC_ATTRIBUTE_CHANGED_FUNCTION (0x10)
// Does this cluster have pre-attribute changed function?
#define CLUSTER_MASK_PRE_ATTRIBUTE_CHANGED_FUNCTION (0x20)
// Cluster is a server
#define CLUSTER_MASK_SERVER (0x40)
// Cluster is a client
#define CLUSTER_MASK_CLIENT (0x80)

// Command masks modify meanings of commands
//
// Is sending of this client command supported
#define COMMAND_MASK_OUTGOING_CLIENT (0x01)
// Is sending of this server command supported
#define COMMAND_MASK_OUTGOING_SERVER (0x02)
// Is receiving of this client command supported
#define COMMAND_MASK_INCOMING_CLIENT (0x04)
// Is receiving of this server command supported
#define COMMAND_MASK_INCOMING_SERVER (0x08)
// Is this command manufacturer specific?
#define COMMAND_MASK_MANUFACTURER_SPECIFIC (0x10)
27 changes: 27 additions & 0 deletions src/app/zap-templates/attribute-id.zapt
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
{{chip_header}}

// Prevent multiple inclusion
#pragma once

{{#zcl_clusters}}
// Attribute ids for cluster: {{label}}

{{#zcl_attributes_client}}
{{#first}}
// Client attributes
{{/first}}
#define ZCL_{{asDelimitedMacro define}}_ATTRIBUTE_ID ({{asHex code 4}})
{{#last}}

{{/last}}
{{/zcl_attributes_client}}
{{#zcl_attributes_server}}
{{#first}}
// Server attributes
{{/first}}
#define ZCL_{{asDelimitedMacro define}}_ATTRIBUTE_ID ({{asHex code 4}})
{{#last}}

{{/last}}
{{/zcl_attributes_server}}
{{/zcl_clusters}}
20 changes: 20 additions & 0 deletions src/app/zap-templates/attribute-type.zapt
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{{chip_header}}

// Prevent multiple inclusion
#pragma once

// ZCL attribute types
enum {
{{#zcl_atomics}}
{{ident}}ZCL_{{asDelimitedMacro name}}_ATTRIBUTE_TYPE = {{asHex atomicId 2}}, // {{description}}
{{/zcl_atomics}}
};

// ZCL attribute sizes
#define ZAP_GENERATED_ATTRIBUTE_SIZES { \
{{#zcl_atomics}}
{{#if size}}
{{ident}}ZCL_{{asDelimitedMacro name}}_ATTRIBUTE_TYPE, {{size}}, \
{{/if}}
{{/zcl_atomics}}
}
127 changes: 127 additions & 0 deletions src/app/zap-templates/call-command-handler-src.zapt
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
{{chip_header}}

#include <stdint.h>

#include "af-structs.h"
#include "call-command-handler.h"
#include "callback.h"
#include "command-id.h"
#include "util.h"

{{#all_user_clusters}}
{{#if (isEnabled enabled)}}
EmberAfStatus emberAf{{asCamelCased name false}}Cluster{{asCamelCased side false}}CommandParse(EmberAfClusterCommand * cmd);
{{/if}}
{{/all_user_clusters}}


static EmberAfStatus status(bool wasHandled, bool clusterExists, bool mfgSpecific)
{
if (wasHandled)
{
return EMBER_ZCL_STATUS_SUCCESS;
}
else if (mfgSpecific)
{
return EMBER_ZCL_STATUS_UNSUP_MANUF_CLUSTER_COMMAND;
}
else if (clusterExists)
{
return EMBER_ZCL_STATUS_UNSUP_COMMAND;
}
else
{
return EMBER_ZCL_STATUS_UNSUPPORTED_CLUSTER;
}
}


// Main command parsing controller.
EmberAfStatus emberAfClusterSpecificCommandParse(EmberAfClusterCommand * cmd)
{
EmberAfStatus result = status(false, false, cmd->mfgSpecific);
if (cmd->direction == (uint8_t) ZCL_DIRECTION_SERVER_TO_CLIENT &&
emberAfContainsClientWithMfgCode(cmd->apsFrame->destinationEndpoint, cmd->apsFrame->clusterId, cmd->mfgCode))
{
switch (cmd->apsFrame->clusterId)
{
{{#all_user_clusters}}
{{#if (isEnabled enabled)}}
{{#if (isClient side) }}
case ZCL_{{asDelimitedMacro define}}_ID :
result = emberAf{{asCamelCased name false}}Cluster{{asCamelCased side false}}CommandParse(cmd);
break;
{{/if}}
{{/if}}
{{/all_user_clusters}}
default:
// Unrecognized cluster ID, error status will apply.
break;
}
}
else if (cmd->direction == (uint8_t) ZCL_DIRECTION_CLIENT_TO_SERVER &&
emberAfContainsServerWithMfgCode(cmd->apsFrame->destinationEndpoint, cmd->apsFrame->clusterId, cmd->mfgCode))
{
switch (cmd->apsFrame->clusterId)
{
{{#all_user_clusters}}
{{#if (isEnabled enabled)}}
{{#unless (isClient side) }}
case ZCL_{{asDelimitedMacro define}}_ID :
result = emberAf{{asCamelCased name false}}Cluster{{asCamelCased side false}}CommandParse(cmd);
break;
{{/unless}}
{{/if}}
{{/all_user_clusters}}
default:
// Unrecognized cluster ID, error status will apply.
break;
}
}
return result;
}

// Cluster specific command parsing

{{#all_user_clusters}}
{{#if (isEnabled enabled)}}
EmberAfStatus emberAf{{asCamelCased name false}}Cluster{{asCamelCased side false}}CommandParse(EmberAfClusterCommand * cmd)
{
bool wasHandled = false;

if (!cmd->mfgSpecific)
{
switch (cmd->commandId)
{
{{#all_user_cluster_commands}}
{{#if (isStrEqual clusterName parent.name)}}
{{#if (isCommandAvailable parent.side incoming outgoing commandSource name)}}
case ZCL_{{asDelimitedMacro name}}_COMMAND_ID: {
{{#if (zcl_command_arguments_count this.id)}}
uint32_t argOffset = 0;
{{#zcl_command_arguments}}
{{asUnderlyingType type}} * {{asSymbol label}} = ({{asUnderlyingType type}} *)(cmd->buffer + argOffset);
{{#unless (isLastElement index count)}}
argOffset+= sizeof({{asUnderlyingType type}});
{{/unless}}
{{/zcl_command_arguments}}

wasHandled = emberAf{{asCamelCased parent.name false}}Cluster{{asCamelCased name false}}Callback({{#zcl_command_arguments}} *{{asSymbol label}}{{#unless (isLastElement index count)}}, {{/unless}}{{/zcl_command_arguments}});
{{else}}
wasHandled = emberAf{{asCamelCased parent.name false}}Cluster{{asCamelCased name false}}Callback();
{{/if}}
break;
}
{{/if}}
{{/if}}
{{/all_user_cluster_commands}}
default: {
// Unrecognized command ID, error status will apply.
break;
}
}
}
return status(wasHandled, true, cmd->mfgSpecific);
}
{{/if}}
{{/all_user_clusters}}
6 changes: 6 additions & 0 deletions src/app/zap-templates/call-command-handler.zapt
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{{chip_header}}

// Prevent multiple inclusion
#pragma once

#include "af-types.h"
67 changes: 67 additions & 0 deletions src/app/zap-templates/callback-stub-src.zapt
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
{{chip_header}}

#include "callback.h"
#include "cluster-id.h"

// Cluster Init Functions
void emberAfClusterInitCallback(uint8_t endpoint, EmberAfClusterId clusterId)
{
switch (clusterId)
{
{{#all_user_clusters_names}}
case ZCL_{{asDelimitedMacro define}}_ID :
emberAf{{asCamelCased name false}}ClusterInitCallback(endpoint);
break;
{{/all_user_clusters_names}}
default:
// Unrecognized cluster ID
break;
}
}

{{#all_user_clusters_names}}
void __attribute__((weak)) emberAf{{asCamelCased name false}}ClusterInitCallback(uint8_t endpoint)
{
// To prevent warning
(void) endpoint;
}
{{/all_user_clusters_names}}

// Cluster Command callback

{{#all_user_clusters}}
{{#if (isEnabled enabled)}}
{{#all_user_cluster_commands}}
{{#if (isStrEqual clusterName parent.name)}}
{{#if (isCommandAvailable parent.side incoming outgoing commandSource)}}
/**
* @brief {{parent.name}} Cluster {{name}} Command callback
{{#if (zcl_command_arguments_count this.id)}}
{{#zcl_command_arguments}}
* @param {{asCamelCased label}}
{{/zcl_command_arguments}}
{{/if}}
*/

{{#if (zcl_command_arguments_count this.id)}}
bool __attribute__((weak)) emberAf{{asCamelCased parent.name false}}Cluster{{asCamelCased name false}}Callback({{#zcl_command_arguments}} {{asUnderlyingType type}} {{asSymbol label}}{{#unless (isLastElement index count)}}, {{/unless}}{{/zcl_command_arguments}})
{
// To prevent warning
{{#zcl_command_arguments}}
(void) {{asSymbol label}};
{{/zcl_command_arguments}}

return false;
}
{{else}}
bool __attribute__((weak)) emberAf{{asCamelCased parent.name false}}Cluster{{asCamelCased name false}}Callback(void)
{
return false;
}
{{/if}}

{{/if}}
{{/if}}
{{/all_user_cluster_commands}}
{{/if}}
{{/all_user_clusters}}
Loading

0 comments on commit c2e5453

Please sign in to comment.