Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
K
k-sdk
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
陈伟灿
k-sdk
Commits
2a352fcf
Commit
2a352fcf
authored
Sep 18, 2020
by
尹佳钦
Browse files
Options
Browse Files
Download
Plain Diff
新增ISA接口
parents
1003bad8
a743a1d1
Changes
10
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
1244 additions
and
1249 deletions
+1244
-1249
common/curl/README.txt
common/curl/README.txt
+8
-8
common/curl/example_curl.c
common/curl/example_curl.c
+51
-51
common/curl/include/libcurl_ubuntu.so
common/curl/include/libcurl_ubuntu.so
+0
-0
midware/midware/dm/kk_property_db.c
midware/midware/dm/kk_property_db.c
+0
-1
platform/zigbee/app/builder/Z3GatewayHost/ZB/dev_config_table/device_3001.json
...uilder/Z3GatewayHost/ZB/dev_config_table/device_3001.json
+0
-4
platform/zigbee/app/builder/Z3GatewayHost/ZB/kk_tsl_property_report.c
...bee/app/builder/Z3GatewayHost/ZB/kk_tsl_property_report.c
+473
-473
platform/zigbee/app/builder/Z3GatewayHost/ZB/kk_tsl_property_report.h
...bee/app/builder/Z3GatewayHost/ZB/kk_tsl_property_report.h
+52
-52
platform/zigbee/protocol/zigbee/app/framework/plugin/device-table/device-table.c
...l/zigbee/app/framework/plugin/device-table/device-table.c
+606
-606
process_check.sh
process_check.sh
+21
-21
rc.local
rc.local
+33
-33
No files found.
common/curl/README.txt
View file @
2a352fcf
1. 版本:tiny-curl-7.72.0
download:https://curl.haxx.se/tiny/
2. 编译so选项:./configure --disable-dict --disable-ftp --disable-imap --disable-ldap --disable-file --disable-gopher --disable-imap --disable-ldaps --disable-pop3 --disable-proxy --disable-rtsp --disable-smtp --disable-telnet --disable-tftp --disable-zlib --without-ca-bundle --without-gnutls --without-libidn --without-librtmp --without-libssh2 --without-nss --without-zlib
3. 交叉编译选项 9531: ./configure --disable-dict --disable-ftp --disable-imap --disable-ldap --disable-file --disable-gopher --disable-imap --disable-ldaps --disable-pop3 --disable-proxy --disable-rtsp --disable-smtp --disable-telnet --disable-tftp --disable-zlib --without-ca-bundle --without-gnutls --without-libidn --without-librtmp --without-libssh2 --without-nss --without-zlib --host=mips-openwrt-linux CC=mips-openwrt-linux-gcc --prefix=$PWD/__install
4. 编译example:gcc -o example_curl example_curl.c -L. -lcurl_ubuntu
1. 版本:tiny-curl-7.72.0
download:https://curl.haxx.se/tiny/
2. 编译so选项:./configure --disable-dict --disable-ftp --disable-imap --disable-ldap --disable-file --disable-gopher --disable-imap --disable-ldaps --disable-pop3 --disable-proxy --disable-rtsp --disable-smtp --disable-telnet --disable-tftp --disable-zlib --without-ca-bundle --without-gnutls --without-libidn --without-librtmp --without-libssh2 --without-nss --without-zlib
3. 交叉编译选项 9531: ./configure --disable-dict --disable-ftp --disable-imap --disable-ldap --disable-file --disable-gopher --disable-imap --disable-ldaps --disable-pop3 --disable-proxy --disable-rtsp --disable-smtp --disable-telnet --disable-tftp --disable-zlib --without-ca-bundle --without-gnutls --without-libidn --without-librtmp --without-libssh2 --without-nss --without-zlib --host=mips-openwrt-linux CC=mips-openwrt-linux-gcc --prefix=$PWD/__install
4. 编译example:gcc -o example_curl example_curl.c -L. -lcurl_ubuntu
common/curl/example_curl.c
View file @
2a352fcf
#include "include/curl.h"
size_t
kk_write_func
(
void
*
ptr
,
size_t
size
,
size_t
nmemb
,
FILE
*
stream
)
{
return
fwrite
(
ptr
,
size
,
nmemb
,
stream
);
}
int
kk_progress_func
(
char
*
progress_data
,
double
t
,
/* dltotal */
double
d
,
/* dlnow */
double
ultotal
,
double
ulnow
)
{
printf
(
"%s %g / %g (%g %%)
\n
"
,
progress_data
,
d
,
t
,
d
*
100
.
0
/
t
);
return
0
;
}
int
main
(
int
argc
,
char
**
argv
)
{
CURL
*
curl
;
CURLcode
res
;
FILE
*
outfile
;
char
*
url
=
argv
[
1
];
//"https://pics0.baidu.com/feed/6609c93d70cf3bc7fecc2bfb9d12faa6cc112af6.jpeg?token=517920fbf7c2fef6ff3ab5ff55bbd8d7";
char
*
progress_data
=
"* "
;
if
(
argc
<
3
){
printf
(
"==inpunt params error, Usage:example_curl <url> <fileName>
\n
"
);
return
0
;
}
curl
=
curl_easy_init
();
if
(
curl
)
{
outfile
=
fopen
(
argv
[
2
],
"wb"
);
//fopen("test.jpg", "wb");
curl_easy_setopt
(
curl
,
CURLOPT_URL
,
url
);
curl_easy_setopt
(
curl
,
CURLOPT_WRITEDATA
,
outfile
);
curl_easy_setopt
(
curl
,
CURLOPT_WRITEFUNCTION
,
kk_write_func
);
curl_easy_setopt
(
curl
,
CURLOPT_NOPROGRESS
,
0
);
curl_easy_setopt
(
curl
,
CURLOPT_PROGRESSFUNCTION
,
kk_progress_func
);
curl_easy_setopt
(
curl
,
CURLOPT_PROGRESSDATA
,
progress_data
);
res
=
curl_easy_perform
(
curl
);
fclose
(
outfile
);
/* always cleanup */
curl_easy_cleanup
(
curl
);
}
return
0
;
}
#include "include/curl.h"
size_t
kk_write_func
(
void
*
ptr
,
size_t
size
,
size_t
nmemb
,
FILE
*
stream
)
{
return
fwrite
(
ptr
,
size
,
nmemb
,
stream
);
}
int
kk_progress_func
(
char
*
progress_data
,
double
t
,
/* dltotal */
double
d
,
/* dlnow */
double
ultotal
,
double
ulnow
)
{
printf
(
"%s %g / %g (%g %%)
\n
"
,
progress_data
,
d
,
t
,
d
*
100
.
0
/
t
);
return
0
;
}
int
main
(
int
argc
,
char
**
argv
)
{
CURL
*
curl
;
CURLcode
res
;
FILE
*
outfile
;
char
*
url
=
argv
[
1
];
//"https://pics0.baidu.com/feed/6609c93d70cf3bc7fecc2bfb9d12faa6cc112af6.jpeg?token=517920fbf7c2fef6ff3ab5ff55bbd8d7";
char
*
progress_data
=
"* "
;
if
(
argc
<
3
){
printf
(
"==inpunt params error, Usage:example_curl <url> <fileName>
\n
"
);
return
0
;
}
curl
=
curl_easy_init
();
if
(
curl
)
{
outfile
=
fopen
(
argv
[
2
],
"wb"
);
//fopen("test.jpg", "wb");
curl_easy_setopt
(
curl
,
CURLOPT_URL
,
url
);
curl_easy_setopt
(
curl
,
CURLOPT_WRITEDATA
,
outfile
);
curl_easy_setopt
(
curl
,
CURLOPT_WRITEFUNCTION
,
kk_write_func
);
curl_easy_setopt
(
curl
,
CURLOPT_NOPROGRESS
,
0
);
curl_easy_setopt
(
curl
,
CURLOPT_PROGRESSFUNCTION
,
kk_progress_func
);
curl_easy_setopt
(
curl
,
CURLOPT_PROGRESSDATA
,
progress_data
);
res
=
curl_easy_perform
(
curl
);
fclose
(
outfile
);
/* always cleanup */
curl_easy_cleanup
(
curl
);
}
return
0
;
}
common/curl/include/libcurl_ubuntu.so
0 → 100644
View file @
2a352fcf
File added
midware/midware/dm/kk_property_db.c
View file @
2a352fcf
...
...
@@ -141,7 +141,6 @@ int kk_property_db_insert(const char *deviceCode,const char *identifier,kk_tsl_d
char
*
zErrMsg
=
0
;
kk_property_db_ctx_t
*
ctx
=
_kk_property_db_get_ctx
();
if
(
_kk_check_property_exist
(
deviceCode
,
identifier
)
==
1
)
{
WARNING_PRINT
(
"[%s][%d] DATA ALREADY EXIST!!!
\n
"
,
__FUNCTION__
,
__LINE__
);
...
...
platform/zigbee/app/builder/Z3GatewayHost/ZB/dev_config_table/device_3001.json
View file @
2a352fcf
...
...
@@ -8,7 +8,3 @@
"attribute"
:
"0x0000"
,
"reportFunc"
:
"kk_tsl_report_global_onoff"
,
"controlFunc"
:
"zclOnOff"
}
]
}
\ No newline at end of file
platform/zigbee/app/builder/Z3GatewayHost/ZB/kk_tsl_property_report.c
View file @
2a352fcf
#include "kk_tsl_property_report.h"
#include "kk_device_manager.h"
#include "kk_rgb_hsl_convert.h"
const
char
*
kk_tsl_rpt_status_string
[]
=
{
"Success"
,
"Error"
,
"Invaild Value"
,
"Invaild Len"
,
"Invaild Type"
};
//todo: fix it
static
cJSON
*
kk_check_identify
(
const
char
*
identify
,
cJSON
*
root
,
int
index
,
int
status
)
{
int
rev
=
0
,
startIdx2
=
0
,
startIdx1
=
0
;
char
*
Identify_str
;
char
tmp_Identity
[
64
]
=
{
0
};
rev
=
kk_tsl_utils_memtok
(
identify
,
'.'
,
2
,
&
startIdx2
);
if
(
!
rev
){
cJSON
*
str
=
NULL
;
cJSON
*
str_r
=
NULL
;
kk_tsl_utils_memtok
(
identify
,
'.'
,
1
,
&
startIdx1
);
str
=
rpc_cJSON_CreateObject
();
Identify_str
=
identify
+
1
+
startIdx2
;
memset
(
tmp_Identity
,
0x0
,
sizeof
(
tmp_Identity
));
memcpy
(
tmp_Identity
,
identify
+
startIdx1
+
1
,
startIdx2
-
startIdx1
);
rpc_cJSON_AddNumberToObject
(
str
,
Identify_str
,
status
);
str_r
=
rpc_cJSON_CreateObject
();
rpc_cJSON_AddItemToObject
(
str_r
,
tmp_Identity
,
str
);
memset
(
tmp_Identity
,
0x0
,
sizeof
(
tmp_Identity
));
memcpy
(
tmp_Identity
,
identify
,
startIdx1
);
rpc_cJSON_AddItemToObject
(
root
,
tmp_Identity
,
str_r
);
return
root
;
}
else
{
rev
=
kk_tsl_utils_memtok
(
identify
,
'.'
,
1
,
&
startIdx1
);
if
(
!
rev
){
cJSON
*
str
=
NULL
;
str
=
rpc_cJSON_CreateObject
();
Identify_str
=
identify
+
1
+
startIdx1
;
memset
(
tmp_Identity
,
0x0
,
sizeof
(
tmp_Identity
));
memcpy
(
tmp_Identity
,
identify
,
startIdx1
);
rpc_cJSON_AddNumberToObject
(
str
,
Identify_str
,
status
);
rpc_cJSON_AddItemToObject
(
root
,
tmp_Identity
,
str
);
return
root
;
}
}
return
NULL
;
}
static
int
kk_tsl_report
(
EmberEUI64
mac
,
uint8_t
EP
,
int
status
,
uint16_t
clusterId
,
uint16_t
attributeId
)
{
cJSON
*
root
,
*
root_tmp
;
int
index
;
char
*
Identify
;
kk_device_table_s
*
dev
;
kk_dev_config_map
*
dev_info
=
NULL
;
kk_dev_config_item
*
item
=
NULL
;
char
macString
[
RPC_EUI64_STRING_LENGTH
];
rpc_eui64ToString
(
mac
,
macString
);
root
=
rpc_cJSON_CreateObject
();
dev
=
kk_device_find_by_mac
(
mac
);
if
(
dev
==
NULL
){
return
tsl_rpt_err
;
}
printf
(
"[%s][%d]dev->productCode:%s
\n
"
,
__FUNCTION__
,
__LINE__
,
dev
->
productCode
);
dev_info
=
kk_device_config_find
(
dev
->
productCode
);
if
(
dev_info
==
NULL
){
return
tsl_rpt_err
;
}
item
=
&
dev_info
->
item
;
#include "kk_tsl_property_report.h"
#include "kk_device_manager.h"
#include "kk_rgb_hsl_convert.h"
const
char
*
kk_tsl_rpt_status_string
[]
=
{
"Success"
,
"Error"
,
"Invaild Value"
,
"Invaild Len"
,
"Invaild Type"
};
//todo: fix it
static
cJSON
*
kk_check_identify
(
const
char
*
identify
,
cJSON
*
root
,
int
index
,
int
status
)
{
int
rev
=
0
,
startIdx2
=
0
,
startIdx1
=
0
;
char
*
Identify_str
;
char
tmp_Identity
[
64
]
=
{
0
};
rev
=
kk_tsl_utils_memtok
(
identify
,
'.'
,
2
,
&
startIdx2
);
if
(
!
rev
){
cJSON
*
str
=
NULL
;
cJSON
*
str_r
=
NULL
;
kk_tsl_utils_memtok
(
identify
,
'.'
,
1
,
&
startIdx1
);
str
=
rpc_cJSON_CreateObject
();
Identify_str
=
identify
+
1
+
startIdx2
;
memset
(
tmp_Identity
,
0x0
,
sizeof
(
tmp_Identity
));
memcpy
(
tmp_Identity
,
identify
+
startIdx1
+
1
,
startIdx2
-
startIdx1
);
rpc_cJSON_AddNumberToObject
(
str
,
Identify_str
,
status
);
str_r
=
rpc_cJSON_CreateObject
();
rpc_cJSON_AddItemToObject
(
str_r
,
tmp_Identity
,
str
);
memset
(
tmp_Identity
,
0x0
,
sizeof
(
tmp_Identity
));
memcpy
(
tmp_Identity
,
identify
,
startIdx1
);
rpc_cJSON_AddItemToObject
(
root
,
tmp_Identity
,
str_r
);
return
root
;
}
else
{
rev
=
kk_tsl_utils_memtok
(
identify
,
'.'
,
1
,
&
startIdx1
);
if
(
!
rev
){
cJSON
*
str
=
NULL
;
str
=
rpc_cJSON_CreateObject
();
Identify_str
=
identify
+
1
+
startIdx1
;
memset
(
tmp_Identity
,
0x0
,
sizeof
(
tmp_Identity
));
memcpy
(
tmp_Identity
,
identify
,
startIdx1
);
rpc_cJSON_AddNumberToObject
(
str
,
Identify_str
,
status
);
rpc_cJSON_AddItemToObject
(
root
,
tmp_Identity
,
str
);
return
root
;
}
}
return
NULL
;
}
static
int
kk_tsl_report
(
EmberEUI64
mac
,
uint8_t
EP
,
int
status
,
uint16_t
clusterId
,
uint16_t
attributeId
)
{
cJSON
*
root
,
*
root_tmp
;
int
index
;
char
*
Identify
;
kk_device_table_s
*
dev
;
kk_dev_config_map
*
dev_info
=
NULL
;
kk_dev_config_item
*
item
=
NULL
;
char
macString
[
RPC_EUI64_STRING_LENGTH
];
rpc_eui64ToString
(
mac
,
macString
);
root
=
rpc_cJSON_CreateObject
();
dev
=
kk_device_find_by_mac
(
mac
);
if
(
dev
==
NULL
){
return
tsl_rpt_err
;
}
printf
(
"[%s][%d]dev->productCode:%s
\n
"
,
__FUNCTION__
,
__LINE__
,
dev
->
productCode
);
dev_info
=
kk_device_config_find
(
dev
->
productCode
);
if
(
dev_info
==
NULL
){
return
tsl_rpt_err
;
}
item
=
&
dev_info
->
item
;
while
(
item
!=
NULL
){
if
(
EP
==
item
->
endpoint
&&
clusterId
==
item
->
cluster
&&
attributeId
==
item
->
attribute
){
Identify
=
item
->
identity
;
break
;
}
item
=
item
->
next
;
}
root_tmp
=
kk_check_identify
(
Identify
,
root
,
index
,
status
);
if
(
root_tmp
!=
NULL
){
kk_rpc_report_status
(
root_tmp
,
mac
);
}
else
{
rpc_cJSON_AddNumberToObject
(
root
,
Identify
,
status
);
kk_msg_report_property
(
root
,
mac
);
}
return
tsl_rpt_success
;
}
//typedef int(*kk_rpc_report)(EmberEUI64 eui64,uint8_t EP,EmberAfClusterId clusterId,EmberAfAttributeId attributeId,uint8_t dataType,uint8_t len,uint8_t *data);
void
kk_tsl_report_attribute
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
)
{
int
i
,
j
,
num
,
status
;
sub_dev_node_t
*
node
=
NULL
;
int
res
=
0
;
char
macString
[
RPC_EUI64_STRING_LENGTH
];
kk_device_table_s
*
dev
;
kk_dev_config_map
*
dev_info
=
NULL
;
kk_dev_config_item
*
item
=
NULL
;
kk_rpc_report
func
;
UTIL_LOG_INFO
(
"
\n
********************kk tsl report attribute********************
\n
"
);
emberAfDebugPrint
(
"mac:"
);
emberAfDebugPrintln
(
",ep:%d,clu:0x%04X,attr:0x%04X,dataType=0x%02x,len=%d,data:"
,
EP
,
clusterId
,
attributeId
,
dataType
,
len
);
emberAfDebugPrintBuffer
(
data
,
len
,
true
);
//rpc_eui64ToString(eui64,macString);
dev
=
kk_device_find_by_mac
(
eui64
);
if
(
dev
==
NULL
){
return
;
}
dev_info
=
kk_device_config_find
(
dev
->
productCode
);
if
(
dev_info
==
NULL
){
return
;
}
item
=
&
dev_info
->
item
;
if
(
EP
==
item
->
endpoint
&&
clusterId
==
item
->
cluster
&&
attributeId
==
item
->
attribute
){
Identify
=
item
->
identity
;
break
;
}
item
=
item
->
next
;
}
root_tmp
=
kk_check_identify
(
Identify
,
root
,
index
,
status
);
if
(
root_tmp
!=
NULL
){
kk_rpc_report_status
(
root_tmp
,
mac
);
}
else
{
rpc_cJSON_AddNumberToObject
(
root
,
Identify
,
status
);
kk_msg_report_property
(
root
,
mac
);
}
return
tsl_rpt_success
;
}
//typedef int(*kk_rpc_report)(EmberEUI64 eui64,uint8_t EP,EmberAfClusterId clusterId,EmberAfAttributeId attributeId,uint8_t dataType,uint8_t len,uint8_t *data);
void
kk_tsl_report_attribute
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
)
{
int
i
,
j
,
num
,
status
;
sub_dev_node_t
*
node
=
NULL
;
int
res
=
0
;
char
macString
[
RPC_EUI64_STRING_LENGTH
];
kk_device_table_s
*
dev
;
kk_dev_config_map
*
dev_info
=
NULL
;
kk_dev_config_item
*
item
=
NULL
;
kk_rpc_report
func
;
UTIL_LOG_INFO
(
"
\n
********************kk tsl report attribute********************
\n
"
);
emberAfDebugPrint
(
"mac:"
);
emberAfDebugPrintln
(
",ep:%d,clu:0x%04X,attr:0x%04X,dataType=0x%02x,len=%d,data:"
,
EP
,
clusterId
,
attributeId
,
dataType
,
len
);
emberAfDebugPrintBuffer
(
data
,
len
,
true
);
//rpc_eui64ToString(eui64,macString);
dev
=
kk_device_find_by_mac
(
eui64
);
if
(
dev
==
NULL
){
return
;
}
dev_info
=
kk_device_config_find
(
dev
->
productCode
);
if
(
dev_info
==
NULL
){
return
;
}
item
=
&
dev_info
->
item
;
while
(
item
!=
NULL
){
if
(
EP
==
item
->
endpoint
&&
clusterId
==
item
->
cluster
&&
attributeId
==
item
->
attribute
){
func
=
item
->
reportFunc
;
if
(
func
!=
NULL
){
func
(
eui64
,
EP
,
clusterId
,
attributeId
,
dataType
,
len
,
data
);
}
else
{
}
return
;
}
item
=
item
->
next
;
}
}
int
kk_tsl_report_global_onoff
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
)
{
uint8_t
OnOff
;
emberAfAppPrintln
(
"[tsl report:Gloabl] OnOff~~~~~~~~~"
);
if
(
dataType
==
ZCL_BOOLEAN_ATTRIBUTE_TYPE
){
if
(
len
==
1
){
OnOff
=
data
[
0
];
if
(
OnOff
==
0
||
OnOff
==
1
){
kk_tsl_report
(
eui64
,
EP
,
OnOff
,
clusterId
,
attributeId
);
return
tsl_rpt_success
;
}
return
tsl_rpt_invaild_val
;
}
return
tsl_rpt_invaild_len
;
}
return
tsl_rpt_invaild_type
;
}
int
kk_tsl_report_windowCovering_mode
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
)
{
uint8_t
mode
;
emberAfAppPrintln
(
"[tsl report:Window Covering] Mode~~~~~~~~~"
);
if
(
dataType
==
ZCL_BITMAP8_ATTRIBUTE_TYPE
){
if
(
len
==
1
){
if
(
data
[
0
]
&
BIT
(
1
)){
mode
=
WC_calibration_mode
;
}
else
if
(
data
[
0
]
&
BIT
(
0
)){
mode
=
WC_reversed_dir
;
}
else
{
mode
=
WC_normal_dir
;
}
kk_tsl_report
(
eui64
,
EP
,
mode
,
clusterId
,
attributeId
);
return
tsl_rpt_success
;
}
return
tsl_rpt_invaild_len
;
}
return
tsl_rpt_invaild_type
;
}
int
kk_tsl_report_windowCovering_position
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
)
{
uint8_t
position
;
emberAfAppPrintln
(
"[tsl report:Window Covering] Position~~~~~~~~~"
);
if
(
dataType
==
ZCL_INT8U_ATTRIBUTE_TYPE
){
if
(
len
==
1
){
position
=
data
[
0
];
kk_tsl_report
(
eui64
,
EP
,
position
,
clusterId
,
attributeId
);
return
tsl_rpt_success
;
}
return
tsl_rpt_invaild_len
;
}
return
tsl_rpt_invaild_type
;
}
int
kk_tsl_report_metering_summationDelivered
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
)
{
uint64_t
summation
;
emberAfAppPrintln
(
"[tsl report:meter(Smart Energy)] Summation Delivered~~~~~~~~~"
);
if
(
dataType
==
ZCL_INT48U_ATTRIBUTE_TYPE
){
if
(
len
==
6
){
summation
=
KK_GET_U48
(
data
);
kk_tsl_report
(
eui64
,
EP
,
summation
,
clusterId
,
attributeId
);
return
tsl_rpt_success
;
}
return
tsl_rpt_invaild_len
;
}
return
tsl_rpt_invaild_type
;
}
int
kk_tsl_report_ias_zoneStatus
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
)
{
uint64_t
Status
;
emberAfAppPrintln
(
"[tsl report:IAS] Zone Status~~~~~~~~~"
);
if
(
dataType
==
ZCL_BITMAP16_ATTRIBUTE_TYPE
){
if
(
len
==
2
){
Status
=
KK_GET_U16
(
data
);
kk_tsl_report
(
eui64
,
EP
,
Status
,
clusterId
,
attributeId
);
return
tsl_rpt_success
;
}
return
tsl_rpt_invaild_len
;
}
return
tsl_rpt_invaild_type
;
}
int
kk_tsl_report_global_Level
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
)
{
uint8_t
level
;
emberAfAppPrintln
(
"[tsl report:Gloabl] Level~~~~~~~~~"
);
if
(
dataType
==
ZCL_INT8U_ATTRIBUTE_TYPE
){
if
(
len
==
1
){
level
=
data
[
0
];
kk_tsl_report
(
eui64
,
EP
,
level
,
clusterId
,
attributeId
);
return
tsl_rpt_success
;
}
return
tsl_rpt_invaild_len
;
}
return
tsl_rpt_invaild_type
;
}
int
kk_tsl_report_temperature_measure
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
)
{
int16_t
Value
;
emberAfAppPrintln
(
"[tsl report:temperature measurement] Measure Value~~~~~~~~~"
);
if
(
dataType
==
ZCL_INT16S_ATTRIBUTE_TYPE
){
if
(
len
==
1
){
Value
=
KK_GET_U16
(
data
);
kk_tsl_report
(
eui64
,
EP
,
Value
,
clusterId
,
attributeId
);
return
tsl_rpt_success
;
}
return
tsl_rpt_invaild_len
;
}
return
tsl_rpt_invaild_type
;
}
int
kk_tsl_report_illuminance_measure
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
)
{
uint16_t
Value
;
emberAfAppPrintln
(
"[tsl report:illuminance measurement] Measure Value~~~~~~~~~"
);
if
(
dataType
==
ZCL_INT16U_ATTRIBUTE_TYPE
){
if
(
len
==
1
){
Value
=
KK_GET_U16
(
data
);
kk_tsl_report
(
eui64
,
EP
,
Value
,
clusterId
,
attributeId
);
return
tsl_rpt_success
;
}
return
tsl_rpt_invaild_len
;
}
return
tsl_rpt_invaild_type
;
}
int
kk_tsl_report_local_temperature
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
)
{
int16_t
Value
;
emberAfAppPrintln
(
"[tsl report:local temperature] Value~~~~~~~~~"
);
if
(
dataType
==
ZCL_INT16S_ATTRIBUTE_TYPE
){
if
(
len
==
1
){
Value
=
KK_GET_U16
(
data
);
kk_tsl_report
(
eui64
,
EP
,
Value
,
clusterId
,
attributeId
);
return
tsl_rpt_success
;
}
return
tsl_rpt_invaild_len
;
}
return
tsl_rpt_invaild_type
;
}
int
kk_tsl_report_OccupiedHeatingSetpoint
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
)
{
int16_t
Value
;
emberAfAppPrintln
(
"[tsl report:Occupied Heating Setpoint] Value~~~~~~~~~"
);
if
(
dataType
==
ZCL_INT16S_ATTRIBUTE_TYPE
){
if
(
len
==
1
){
Value
=
KK_GET_U16
(
data
);
kk_tsl_report
(
eui64
,
EP
,
Value
,
clusterId
,
attributeId
);
return
tsl_rpt_success
;
}
return
tsl_rpt_invaild_len
;
}
return
tsl_rpt_invaild_type
;
}
int
kk_tsl_report_Concentration
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
)
{
int32_t
Value
;
emberAfAppPrintln
(
"[tsl report:Formaldehyde] Value~~~~~~~~~"
);
if
(
dataType
==
ZCL_FLOAT_SINGLE_ATTRIBUTE_TYPE
){
if
(
len
==
1
){
Value
=
KK_GET_U32
(
data
);
kk_tsl_report
(
eui64
,
EP
,
Value
,
clusterId
,
attributeId
);
return
tsl_rpt_success
;
}
return
tsl_rpt_invaild_len
;
}
return
tsl_rpt_invaild_type
;
}
int
kk_tsl_report_Formaldehyde
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
)
{
emberAfAppPrintln
(
"[tsl report:Formaldehyde] Value~~~~~~~~~"
);
return
kk_tsl_report_Concentration
(
eui64
,
EP
,
clusterId
,
attributeId
,
dataType
,
len
,
data
);
}
int
kk_tsl_report_PM2_5
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
)
{
emberAfAppPrintln
(
"[tsl report:PM2.5] Value~~~~~~~~~"
);
return
kk_tsl_report_Concentration
(
eui64
,
EP
,
clusterId
,
attributeId
,
dataType
,
len
,
data
);
}
int
kk_tsl_report_CO2
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
)
{
emberAfAppPrintln
(
"[tsl report:CO2] Value~~~~~~~~~"
);
return
kk_tsl_report_Concentration
(
eui64
,
EP
,
clusterId
,
attributeId
,
dataType
,
len
,
data
);
}
int
kk_tsl_report_colorControl_Brightness
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
)
{
uint8_t
value
=
data
[
0
];
emberAfAppPrintln
(
"[tsl report:kk_tsl_report_global_Brightness] value:%d
\n
"
,
value
);
if
(
dataType
==
ZCL_INT8U_ATTRIBUTE_TYPE
){
if
(
len
==
1
){
kk_tsl_report
(
eui64
,
EP
,
value
,
clusterId
,
attributeId
);
return
tsl_rpt_success
;
}
return
tsl_rpt_invaild_len
;
}
return
tsl_rpt_invaild_type
;
}
static
int
s_HSLCount
=
0
;
COLOR_HSL
g_hsl
=
{
0
,
0
,
0
};
int
kk_tsl_report_colorControl_RGB
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
)
{
uint8_t
value
=
data
[
0
];
kk_device_table_s
*
dev
;
kk_dev_config_map
*
dev_info
=
NULL
;
kk_dev_config_item
*
item
=
NULL
;
cJSON
*
root
;
int
rev
=
0
;
int
startIdx
=
0
;
cJSON
*
root_color
=
NULL
;
char
tmp_Identity
[
64
]
=
{
0
};
COLOR_RGB
g_rgb
=
{
0
,
0
,
0
};
emberAfAppPrintln
(
"[tsl report:kk_tsl_report_global_RGB] value:%d
\n
"
,
value
);
if
(
dataType
==
ZCL_INT8U_ATTRIBUTE_TYPE
){
if
(
attributeId
==
0x0001
){
g_hsl
.
saturation
=
value
;
s_HSLCount
++
;
}
else
if
(
attributeId
==
0x0
){
g_hsl
.
hue
=
value
;
s_HSLCount
++
;
}
}
if
(
s_HSLCount
>=
2
){
s_HSLCount
=
0
;
HSLtoRGB
(
&
g_hsl
,
&
g_rgb
);
dev
=
kk_device_find_by_mac
(
eui64
);
if
(
dev
==
NULL
){
return
tsl_rpt_err
;
}
dev_info
=
kk_device_config_find
(
dev
->
productCode
);
if
(
dev_info
==
NULL
){
return
tsl_rpt_err
;
}
item
=
&
dev_info
->
item
;
while
(
item
!=
NULL
){
if
(
strstr
(
item
->
identity
,
".red"
)
!=
NULL
){
if
(
root_color
==
NULL
){
root_color
=
rpc_cJSON_CreateObject
();
}
rev
=
kk_tsl_utils_memtok
(
item
->
identity
,
'.'
,
1
,
&
startIdx
);
if
(
!
rev
){
memcpy
(
tmp_Identity
,
item
->
identity
,
startIdx
);
rpc_cJSON_AddNumberToObject
(
root_color
,
item
->
identity
+
1
+
startIdx
,
g_rgb
.
red
);
}
}
else
if
(
strstr
(
item
->
identity
,
".green"
)
!=
NULL
){
if
(
root_color
==
NULL
){
root_color
=
rpc_cJSON_CreateObject
();
}
rev
=
kk_tsl_utils_memtok
(
item
->
identity
,
'.'
,
1
,
&
startIdx
);
if
(
!
rev
){
memcpy
(
tmp_Identity
,
item
->
identity
,
startIdx
);
rpc_cJSON_AddNumberToObject
(
root_color
,
item
->
identity
+
1
+
startIdx
,
g_rgb
.
green
);
}
}
else
if
(
strstr
(
item
->
identity
,
".blue"
)
!=
NULL
){
if
(
root_color
==
NULL
){
root_color
=
rpc_cJSON_CreateObject
();
}
rev
=
kk_tsl_utils_memtok
(
item
->
identity
,
'.'
,
1
,
&
startIdx
);
if
(
!
rev
){
memcpy
(
tmp_Identity
,
item
->
identity
,
startIdx
);
rpc_cJSON_AddNumberToObject
(
root_color
,
item
->
identity
+
1
+
startIdx
,
g_rgb
.
blue
);
}
}
item
=
item
->
next
;
}
if
(
root_color
!=
NULL
){
root
=
rpc_cJSON_CreateObject
();
rpc_cJSON_AddItemToObject
(
root
,
tmp_Identity
,
root_color
);
kk_msg_report_property
(
root
,
eui64
);
return
tsl_rpt_success
;
}
}
return
tsl_rpt_err
;
}
if
(
EP
==
item
->
endpoint
&&
clusterId
==
item
->
cluster
&&
attributeId
==
item
->
attribute
){
func
=
item
->
reportFunc
;
if
(
func
!=
NULL
){
func
(
eui64
,
EP
,
clusterId
,
attributeId
,
dataType
,
len
,
data
);
}
else
{
}
return
;
}
item
=
item
->
next
;
}
}
int
kk_tsl_report_global_onoff
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
)
{
uint8_t
OnOff
;
emberAfAppPrintln
(
"[tsl report:Gloabl] OnOff~~~~~~~~~"
);
if
(
dataType
==
ZCL_BOOLEAN_ATTRIBUTE_TYPE
){
if
(
len
==
1
){
OnOff
=
data
[
0
];
if
(
OnOff
==
0
||
OnOff
==
1
){
kk_tsl_report
(
eui64
,
EP
,
OnOff
,
clusterId
,
attributeId
);
return
tsl_rpt_success
;
}
return
tsl_rpt_invaild_val
;
}
return
tsl_rpt_invaild_len
;
}
return
tsl_rpt_invaild_type
;
}
int
kk_tsl_report_windowCovering_mode
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
)
{
uint8_t
mode
;
emberAfAppPrintln
(
"[tsl report:Window Covering] Mode~~~~~~~~~"
);
if
(
dataType
==
ZCL_BITMAP8_ATTRIBUTE_TYPE
){
if
(
len
==
1
){
if
(
data
[
0
]
&
BIT
(
1
)){
mode
=
WC_calibration_mode
;
}
else
if
(
data
[
0
]
&
BIT
(
0
)){
mode
=
WC_reversed_dir
;
}
else
{
mode
=
WC_normal_dir
;
}
kk_tsl_report
(
eui64
,
EP
,
mode
,
clusterId
,
attributeId
);
return
tsl_rpt_success
;
}
return
tsl_rpt_invaild_len
;
}
return
tsl_rpt_invaild_type
;
}
int
kk_tsl_report_windowCovering_position
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
)
{
uint8_t
position
;
emberAfAppPrintln
(
"[tsl report:Window Covering] Position~~~~~~~~~"
);
if
(
dataType
==
ZCL_INT8U_ATTRIBUTE_TYPE
){
if
(
len
==
1
){
position
=
data
[
0
];
kk_tsl_report
(
eui64
,
EP
,
position
,
clusterId
,
attributeId
);
return
tsl_rpt_success
;
}
return
tsl_rpt_invaild_len
;
}
return
tsl_rpt_invaild_type
;
}
int
kk_tsl_report_metering_summationDelivered
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
)
{
uint64_t
summation
;
emberAfAppPrintln
(
"[tsl report:meter(Smart Energy)] Summation Delivered~~~~~~~~~"
);
if
(
dataType
==
ZCL_INT48U_ATTRIBUTE_TYPE
){
if
(
len
==
6
){
summation
=
KK_GET_U48
(
data
);
kk_tsl_report
(
eui64
,
EP
,
summation
,
clusterId
,
attributeId
);
return
tsl_rpt_success
;
}
return
tsl_rpt_invaild_len
;
}
return
tsl_rpt_invaild_type
;
}
int
kk_tsl_report_ias_zoneStatus
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
)
{
uint64_t
Status
;
emberAfAppPrintln
(
"[tsl report:IAS] Zone Status~~~~~~~~~"
);
if
(
dataType
==
ZCL_BITMAP16_ATTRIBUTE_TYPE
){
if
(
len
==
2
){
Status
=
KK_GET_U16
(
data
);
kk_tsl_report
(
eui64
,
EP
,
Status
,
clusterId
,
attributeId
);
return
tsl_rpt_success
;
}
return
tsl_rpt_invaild_len
;
}
return
tsl_rpt_invaild_type
;
}
int
kk_tsl_report_global_Level
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
)
{
uint8_t
level
;
emberAfAppPrintln
(
"[tsl report:Gloabl] Level~~~~~~~~~"
);
if
(
dataType
==
ZCL_INT8U_ATTRIBUTE_TYPE
){
if
(
len
==
1
){
level
=
data
[
0
];
kk_tsl_report
(
eui64
,
EP
,
level
,
clusterId
,
attributeId
);
return
tsl_rpt_success
;
}
return
tsl_rpt_invaild_len
;
}
return
tsl_rpt_invaild_type
;
}
int
kk_tsl_report_temperature_measure
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
)
{
int16_t
Value
;
emberAfAppPrintln
(
"[tsl report:temperature measurement] Measure Value~~~~~~~~~"
);
if
(
dataType
==
ZCL_INT16S_ATTRIBUTE_TYPE
){
if
(
len
==
1
){
Value
=
KK_GET_U16
(
data
);
kk_tsl_report
(
eui64
,
EP
,
Value
,
clusterId
,
attributeId
);
return
tsl_rpt_success
;
}
return
tsl_rpt_invaild_len
;
}
return
tsl_rpt_invaild_type
;
}
int
kk_tsl_report_illuminance_measure
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
)
{
uint16_t
Value
;
emberAfAppPrintln
(
"[tsl report:illuminance measurement] Measure Value~~~~~~~~~"
);
if
(
dataType
==
ZCL_INT16U_ATTRIBUTE_TYPE
){
if
(
len
==
1
){
Value
=
KK_GET_U16
(
data
);
kk_tsl_report
(
eui64
,
EP
,
Value
,
clusterId
,
attributeId
);
return
tsl_rpt_success
;
}
return
tsl_rpt_invaild_len
;
}
return
tsl_rpt_invaild_type
;
}
int
kk_tsl_report_local_temperature
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
)
{
int16_t
Value
;
emberAfAppPrintln
(
"[tsl report:local temperature] Value~~~~~~~~~"
);
if
(
dataType
==
ZCL_INT16S_ATTRIBUTE_TYPE
){
if
(
len
==
1
){
Value
=
KK_GET_U16
(
data
);
kk_tsl_report
(
eui64
,
EP
,
Value
,
clusterId
,
attributeId
);
return
tsl_rpt_success
;
}
return
tsl_rpt_invaild_len
;
}
return
tsl_rpt_invaild_type
;
}
int
kk_tsl_report_OccupiedHeatingSetpoint
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
)
{
int16_t
Value
;
emberAfAppPrintln
(
"[tsl report:Occupied Heating Setpoint] Value~~~~~~~~~"
);
if
(
dataType
==
ZCL_INT16S_ATTRIBUTE_TYPE
){
if
(
len
==
1
){
Value
=
KK_GET_U16
(
data
);
kk_tsl_report
(
eui64
,
EP
,
Value
,
clusterId
,
attributeId
);
return
tsl_rpt_success
;
}
return
tsl_rpt_invaild_len
;
}
return
tsl_rpt_invaild_type
;
}
int
kk_tsl_report_Concentration
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
)
{
int32_t
Value
;
emberAfAppPrintln
(
"[tsl report:Formaldehyde] Value~~~~~~~~~"
);
if
(
dataType
==
ZCL_FLOAT_SINGLE_ATTRIBUTE_TYPE
){
if
(
len
==
1
){
Value
=
KK_GET_U32
(
data
);
kk_tsl_report
(
eui64
,
EP
,
Value
,
clusterId
,
attributeId
);
return
tsl_rpt_success
;
}
return
tsl_rpt_invaild_len
;
}
return
tsl_rpt_invaild_type
;
}
int
kk_tsl_report_Formaldehyde
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
)
{
emberAfAppPrintln
(
"[tsl report:Formaldehyde] Value~~~~~~~~~"
);
return
kk_tsl_report_Concentration
(
eui64
,
EP
,
clusterId
,
attributeId
,
dataType
,
len
,
data
);
}
int
kk_tsl_report_PM2_5
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
)
{
emberAfAppPrintln
(
"[tsl report:PM2.5] Value~~~~~~~~~"
);
return
kk_tsl_report_Concentration
(
eui64
,
EP
,
clusterId
,
attributeId
,
dataType
,
len
,
data
);
}
int
kk_tsl_report_CO2
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
)
{
emberAfAppPrintln
(
"[tsl report:CO2] Value~~~~~~~~~"
);
return
kk_tsl_report_Concentration
(
eui64
,
EP
,
clusterId
,
attributeId
,
dataType
,
len
,
data
);
}
int
kk_tsl_report_colorControl_Brightness
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
)
{
uint8_t
value
=
data
[
0
];
emberAfAppPrintln
(
"[tsl report:kk_tsl_report_global_Brightness] value:%d
\n
"
,
value
);
if
(
dataType
==
ZCL_INT8U_ATTRIBUTE_TYPE
){
if
(
len
==
1
){
kk_tsl_report
(
eui64
,
EP
,
value
,
clusterId
,
attributeId
);
return
tsl_rpt_success
;
}
return
tsl_rpt_invaild_len
;
}
return
tsl_rpt_invaild_type
;
}
static
int
s_HSLCount
=
0
;
COLOR_HSL
g_hsl
=
{
0
,
0
,
0
};
int
kk_tsl_report_colorControl_RGB
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
)
{
uint8_t
value
=
data
[
0
];
kk_device_table_s
*
dev
;
kk_dev_config_map
*
dev_info
=
NULL
;
kk_dev_config_item
*
item
=
NULL
;
cJSON
*
root
;
int
rev
=
0
;
int
startIdx
=
0
;
cJSON
*
root_color
=
NULL
;
char
tmp_Identity
[
64
]
=
{
0
};
COLOR_RGB
g_rgb
=
{
0
,
0
,
0
};
emberAfAppPrintln
(
"[tsl report:kk_tsl_report_global_RGB] value:%d
\n
"
,
value
);
if
(
dataType
==
ZCL_INT8U_ATTRIBUTE_TYPE
){
if
(
attributeId
==
0x0001
){
g_hsl
.
saturation
=
value
;
s_HSLCount
++
;
}
else
if
(
attributeId
==
0x0
){
g_hsl
.
hue
=
value
;
s_HSLCount
++
;
}
}
if
(
s_HSLCount
>=
2
){
s_HSLCount
=
0
;
HSLtoRGB
(
&
g_hsl
,
&
g_rgb
);
dev
=
kk_device_find_by_mac
(
eui64
);
if
(
dev
==
NULL
){
return
tsl_rpt_err
;
}
dev_info
=
kk_device_config_find
(
dev
->
productCode
);
if
(
dev_info
==
NULL
){
return
tsl_rpt_err
;
}
item
=
&
dev_info
->
item
;
while
(
item
!=
NULL
){
if
(
strstr
(
item
->
identity
,
".red"
)
!=
NULL
){
if
(
root_color
==
NULL
){
root_color
=
rpc_cJSON_CreateObject
();
}
rev
=
kk_tsl_utils_memtok
(
item
->
identity
,
'.'
,
1
,
&
startIdx
);
if
(
!
rev
){
memcpy
(
tmp_Identity
,
item
->
identity
,
startIdx
);
rpc_cJSON_AddNumberToObject
(
root_color
,
item
->
identity
+
1
+
startIdx
,
g_rgb
.
red
);
}
}
else
if
(
strstr
(
item
->
identity
,
".green"
)
!=
NULL
){
if
(
root_color
==
NULL
){
root_color
=
rpc_cJSON_CreateObject
();
}
rev
=
kk_tsl_utils_memtok
(
item
->
identity
,
'.'
,
1
,
&
startIdx
);
if
(
!
rev
){
memcpy
(
tmp_Identity
,
item
->
identity
,
startIdx
);
rpc_cJSON_AddNumberToObject
(
root_color
,
item
->
identity
+
1
+
startIdx
,
g_rgb
.
green
);
}
}
else
if
(
strstr
(
item
->
identity
,
".blue"
)
!=
NULL
){
if
(
root_color
==
NULL
){
root_color
=
rpc_cJSON_CreateObject
();
}
rev
=
kk_tsl_utils_memtok
(
item
->
identity
,
'.'
,
1
,
&
startIdx
);
if
(
!
rev
){
memcpy
(
tmp_Identity
,
item
->
identity
,
startIdx
);
rpc_cJSON_AddNumberToObject
(
root_color
,
item
->
identity
+
1
+
startIdx
,
g_rgb
.
blue
);
}
}
item
=
item
->
next
;
}
if
(
root_color
!=
NULL
){
root
=
rpc_cJSON_CreateObject
();
rpc_cJSON_AddItemToObject
(
root
,
tmp_Identity
,
root_color
);
kk_msg_report_property
(
root
,
eui64
);
return
tsl_rpt_success
;
}
}
return
tsl_rpt_err
;
}
platform/zigbee/app/builder/Z3GatewayHost/ZB/kk_tsl_property_report.h
View file @
2a352fcf
#ifndef __KK_TSL_PROPERTY_REPORT_H
#define __KK_TSL_PROPERTY_REPORT_H
#include "kk_zb_com.h"
#include "kk_msg_report.h"
typedef
enum
{
tsl_rpt_success
=
0
,
tsl_rpt_err
=
-
1
,
tsl_rpt_invaild_val
=
-
2
,
tsl_rpt_invaild_len
=
-
3
,
tsl_rpt_invaild_type
=
-
4
,
}
kk_tsl_rpt_status
;
void
kk_tsl_report_attribute
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
);
int
kk_tsl_report_global_onoff
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
);
int
kk_tsl_report_windowCovering_mode
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
);
int
kk_tsl_report_windowCovering_position
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
);
int
kk_tsl_report_ias_zoneStatus
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
);
int
kk_tsl_report_metering_summationDelivered
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
);
int
kk_tsl_report_global_Level
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
);
int
kk_tsl_report_temperature_measure
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
);
int
kk_tsl_report_illuminance_measure
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
);
int
kk_tsl_report_local_temperature
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
);
int
kk_tsl_report_OccupiedHeatingSetpoint
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
);
int
kk_tsl_report_Formaldehyde
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
);
int
kk_tsl_report_PM2_5
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
);
int
kk_tsl_report_CO2
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
);
int
kk_tsl_report_colorControl_Brightness
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
);
int
kk_tsl_report_colorControl_RGB
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
);
#endif
#ifndef __KK_TSL_PROPERTY_REPORT_H
#define __KK_TSL_PROPERTY_REPORT_H
#include "kk_zb_com.h"
#include "kk_msg_report.h"
typedef
enum
{
tsl_rpt_success
=
0
,
tsl_rpt_err
=
-
1
,
tsl_rpt_invaild_val
=
-
2
,
tsl_rpt_invaild_len
=
-
3
,
tsl_rpt_invaild_type
=
-
4
,
}
kk_tsl_rpt_status
;
void
kk_tsl_report_attribute
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
);
int
kk_tsl_report_global_onoff
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
);
int
kk_tsl_report_windowCovering_mode
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
);
int
kk_tsl_report_windowCovering_position
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
);
int
kk_tsl_report_ias_zoneStatus
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
);
int
kk_tsl_report_metering_summationDelivered
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
);
int
kk_tsl_report_global_Level
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
);
int
kk_tsl_report_temperature_measure
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
);
int
kk_tsl_report_illuminance_measure
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
);
int
kk_tsl_report_local_temperature
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
);
int
kk_tsl_report_OccupiedHeatingSetpoint
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
);
int
kk_tsl_report_Formaldehyde
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
);
int
kk_tsl_report_PM2_5
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
);
int
kk_tsl_report_CO2
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
);
int
kk_tsl_report_colorControl_Brightness
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
);
int
kk_tsl_report_colorControl_RGB
(
EmberEUI64
eui64
,
uint8_t
EP
,
EmberAfClusterId
clusterId
,
EmberAfAttributeId
attributeId
,
uint8_t
dataType
,
uint8_t
len
,
uint8_t
*
data
);
#endif
platform/zigbee/protocol/zigbee/app/framework/plugin/device-table/device-table.c
View file @
2a352fcf
// Copyright 2016 Silicon Laboratories, Inc. *80*
#include PLATFORM_HEADER
#ifdef EZSP_HOST
// Includes needed for functions related to the EZSP host
#include "stack/include/error.h"
#include "stack/include/ember-types.h"
#include "app/util/ezsp/ezsp-protocol.h"
#include "app/util/ezsp/ezsp.h"
#include "app/util/ezsp/serial-interface.h"
#include "app/util/zigbee-framework/zigbee-device-common.h"
#else
#include "stack/include/ember.h"
#endif
#include "af.h"
#include "af-main.h"
#include "attribute-storage.h"
#include "common.h"
#include "hal/hal.h"
#include "app/util/serial/command-interpreter2.h"
#include "stack/include/event.h"
#include "app/framework/plugin/concentrator/source-route-host.h"
#include "app/framework/plugin/device-table/device-table.h"
#include "app/framework/plugin/device-table/device-table-internal.h"
#include "app/framework/util/util.h"
#include <stdlib.h>
#include <kk_test.h>
void
emAfDeviceTableSave
(
void
);
void
emAfDeviceTableLoad
(
void
);
// Framework message send global data
extern
uint8_t
appZclBuffer
[];
extern
uint16_t
appZclBufferLen
;
extern
bool
zclCmdIsBuilt
;
extern
EmberApsFrame
globalApsFrame
;
extern
void
emAfApsFrameEndpointSetup
(
uint8_t
srcEndpoint
,
uint8_t
dstEndpoint
);
static
EmberAfPluginDeviceTableEntry
deviceTable
[
EMBER_AF_PLUGIN_DEVICE_TABLE_DEVICE_TABLE_SIZE
];
EmberStatus
emberAfGetChildData
(
uint8_t
index
,
EmberChildData
*
childData
);
// Device discovery global declarations
void
emAfDeviceTableInitiateRouteRepair
(
EmberNodeId
nodeId
);
static
void
clearDeviceTableIndex
(
uint16_t
index
);
EmberAfPluginDeviceTableEntry
*
emberAfDeviceTablePointer
(
void
)
{
return
deviceTable
;
}
uint16_t
emberAfDeviceTableGetNodeIdFromIndex
(
uint16_t
index
)
{
EmberAfPluginDeviceTableEntry
*
deviceTable
=
emberAfDeviceTablePointer
();
assert
(
index
<
EMBER_AF_PLUGIN_DEVICE_TABLE_DEVICE_TABLE_SIZE
);
return
deviceTable
[
index
].
nodeId
;
}
uint8_t
emAfDeviceTableGetFirstEndpointFromIndex
(
uint16_t
index
)
{
assert
(
index
<
EMBER_AF_PLUGIN_DEVICE_TABLE_DEVICE_TABLE_SIZE
);
return
deviceTable
[
index
].
endpoint
;
}
static
void
matchReverseEui64
(
EmberEUI64
eui64a
,
EmberEUI64
eui64b
)
{
uint8_t
i
;
for
(
i
=
0
;
i
<
EUI64_SIZE
;
i
++
)
{
if
(
eui64a
[
i
]
!=
eui64b
[(
EUI64_SIZE
-
1
)
-
i
])
{
return
;
}
}
emberAfCorePrintln
(
"MATCH_EUI: EUI matches backwards"
);
emberAfCorePrint
(
"A:"
);
emAfDeviceTablePrintEUI64
(
eui64a
);
emberAfCorePrint
(
" B:"
);
emAfDeviceTablePrintEUI64
(
eui64b
);
emberAfCorePrintln
(
""
);
}
static
void
checkNullEui64
(
EmberEUI64
eui64a
,
EmberEUI64
eui64b
)
{
uint8_t
i
;
for
(
i
=
0
;
i
<
EUI64_SIZE
;
i
++
)
{
if
(
eui64a
[
i
]
!=
0xff
||
eui64b
[
i
]
!=
0xff
)
{
return
;
}
}
emberAfCorePrintln
(
"MatchEUI: two null EUI"
);
}
static
bool
matchEui64
(
EmberEUI64
a
,
EmberEUI64
b
)
{
checkNullEui64
(
a
,
b
);
if
(
MEMCOMPARE
(
a
,
b
,
EUI64_SIZE
)
==
0
)
{
return
true
;
}
else
{
// Test to see if the EUI64 is backwards
matchReverseEui64
(
a
,
b
);
return
false
;
}
}
bool
emberAfDeviceTableMatchEui64
(
EmberEUI64
eui64a
,
EmberEUI64
eui64b
)
{
return
matchEui64
(
eui64a
,
eui64b
);
}
static
void
unsetEui64
(
EmberEUI64
eui64
)
{
uint8_t
i
;
for
(
i
=
0
;
i
<
8
;
i
++
)
{
eui64
[
i
]
=
0xff
;
}
}
static
void
clearDeviceTableIndex
(
uint16_t
index
)
{
uint8_t
i
;
assert
(
index
<
EMBER_AF_PLUGIN_DEVICE_TABLE_DEVICE_TABLE_SIZE
);
deviceTable
[
index
].
nodeId
=
EMBER_AF_PLUGIN_DEVICE_TABLE_NULL_NODE_ID
;
unsetEui64
(
deviceTable
[
index
].
eui64
);
deviceTable
[
index
].
state
=
EMBER_AF_PLUGIN_DEVICE_TABLE_STATE_NULL
;
deviceTable
[
index
].
endpoint
=
0
;
for
(
i
=
0
;
i
<
EMBER_AF_PLUGIN_DEVICE_TABLE_CLUSTER_SIZE
;
i
++
)
{
deviceTable
[
index
].
clusterIds
[
i
]
=
ZCL_NULL_CLUSTER_ID
;
}
deviceTable
[
index
].
clusterOutStartPosition
=
0
;
}
void
emAfPluginDeviceTableDeleteEntry
(
uint16_t
index
)
{
uint16_t
currentIndex
;
while
(
index
!=
EMBER_AF_PLUGIN_DEVICE_TABLE_NULL_INDEX
)
{
currentIndex
=
index
;
// Need to compute the next index before deleting the current one. Or else
// the call to next endpoint will yield a bogus result.
index
=
emAfDeviceTableFindNextEndpoint
(
index
);
clearDeviceTableIndex
(
currentIndex
);
emberAfPluginDeviceTableIndexRemovedCallback
(
currentIndex
);
}
}
void
emAfDeviceTableInit
(
void
)
{
uint16_t
i
;
for
(
i
=
0
;
i
<
EMBER_AF_PLUGIN_DEVICE_TABLE_DEVICE_TABLE_SIZE
;
i
++
)
{
clearDeviceTableIndex
(
i
);
}
}
void
emberAfDeviceTableClear
(
void
)
{
emAfDeviceTableInit
();
emAfDeviceTableSave
();
//emberAfPluginDeviceTableClearedCallback();
}
uint16_t
emberAfDeviceTableGetIndexFromEui64AndEndpoint
(
EmberEUI64
eui64
,
uint8_t
endpoint
)
{
uint16_t
i
;
for
(
i
=
0
;
i
<
EMBER_AF_PLUGIN_DEVICE_TABLE_DEVICE_TABLE_SIZE
;
i
++
)
{
if
(
matchEui64
(
deviceTable
[
i
].
eui64
,
eui64
)
&&
deviceTable
[
i
].
endpoint
==
endpoint
)
{
return
i
;
}
}
return
EMBER_AF_PLUGIN_DEVICE_TABLE_NULL_INDEX
;
}
uint16_t
emberAfDeviceTableGetNodeIdFromEui64
(
EmberEUI64
eui64
)
{
uint16_t
i
;
for
(
i
=
0
;
i
<
EMBER_AF_PLUGIN_DEVICE_TABLE_DEVICE_TABLE_SIZE
;
i
++
)
{
if
(
matchEui64
(
deviceTable
[
i
].
eui64
,
eui64
)
)
{
return
deviceTable
[
i
].
nodeId
;
}
}
return
EMBER_AF_PLUGIN_DEVICE_TABLE_NULL_NODE_ID
;
}
bool
emberAfDeviceTableGetEui64FromNodeId
(
EmberNodeId
emberNodeId
,
EmberEUI64
eui64
)
{
uint16_t
i
;
for
(
i
=
0
;
i
<
EMBER_AF_PLUGIN_DEVICE_TABLE_DEVICE_TABLE_SIZE
;
i
++
)
{
if
(
deviceTable
[
i
].
nodeId
==
emberNodeId
)
{
MEMCOPY
(
eui64
,
deviceTable
[
i
].
eui64
,
EUI64_SIZE
);
return
true
;
}
}
return
false
;
}
uint16_t
emberAfDeviceTableGetIndexFromNodeId
(
EmberNodeId
emberNodeId
)
{
uint16_t
i
;
for
(
i
=
0
;
i
<
EMBER_AF_PLUGIN_DEVICE_TABLE_DEVICE_TABLE_SIZE
;
i
++
)
{
if
(
deviceTable
[
i
].
nodeId
==
emberNodeId
)
{
return
i
;
}
}
return
EMBER_AF_PLUGIN_DEVICE_TABLE_NULL_INDEX
;
}
uint16_t
emAfDeviceTableFindFreeDeviceTableIndex
(
void
)
{
uint16_t
i
;
for
(
i
=
0
;
i
<
EMBER_AF_PLUGIN_DEVICE_TABLE_DEVICE_TABLE_SIZE
;
i
++
)
{
if
(
deviceTable
[
i
].
nodeId
==
EMBER_AF_PLUGIN_DEVICE_TABLE_NULL_NODE_ID
)
{
return
i
;
}
}
return
EMBER_AF_PLUGIN_DEVICE_TABLE_NULL_INDEX
;
}
uint16_t
emberAfDeviceTableGetEndpointFromNodeIdAndEndpoint
(
EmberNodeId
emberNodeId
,
uint8_t
endpoint
)
{
uint16_t
i
;
for
(
i
=
0
;
i
<
EMBER_AF_PLUGIN_DEVICE_TABLE_DEVICE_TABLE_SIZE
;
i
++
)
{
if
(
deviceTable
[
i
].
nodeId
==
emberNodeId
&&
deviceTable
[
i
].
endpoint
==
endpoint
)
{
return
i
;
}
}
return
EMBER_AF_PLUGIN_DEVICE_TABLE_NULL_INDEX
;
}
void
emAfDeviceTableCopyDeviceTableEntry
(
uint16_t
fromIndex
,
uint16_t
toIndex
)
{
EmberAfPluginDeviceTableEntry
*
from
=
&
(
deviceTable
[
fromIndex
]);
EmberAfPluginDeviceTableEntry
*
to
=
&
(
deviceTable
[
toIndex
]);
// make sure the fromIndex is in the valud range.
assert
(
fromIndex
<
EMBER_AF_PLUGIN_DEVICE_TABLE_DEVICE_TABLE_SIZE
);
// make sure the fromIndex has a valid entry
assert
(
deviceTable
[
fromIndex
].
nodeId
!=
EMBER_AF_PLUGIN_DEVICE_TABLE_NULL_NODE_ID
);
// make sure the toIndex is in the valud range.
assert
(
toIndex
<
EMBER_AF_PLUGIN_DEVICE_TABLE_DEVICE_TABLE_SIZE
);
MEMCOPY
(
to
,
from
,
sizeof
(
EmberAfPluginDeviceTableEntry
));
}
uint8_t
emAfDeviceTableNumberOfEndpointsFromIndex
(
uint16_t
index
)
{
uint8_t
count
=
0
;
uint16_t
currentNodeId
=
emberAfDeviceTableGetNodeIdFromIndex
(
index
);
uint16_t
i
;
for
(
i
=
0
;
i
<
EMBER_AF_PLUGIN_DEVICE_TABLE_DEVICE_TABLE_SIZE
;
i
++
)
{
if
(
deviceTable
[
i
].
nodeId
==
currentNodeId
)
{
count
++
;
}
}
return
count
;
}
static
uint16_t
findIndexFromNodeIdAndIndex
(
uint16_t
nodeId
,
uint16_t
index
)
{
uint16_t
i
;
for
(
i
=
index
;
i
<
EMBER_AF_PLUGIN_DEVICE_TABLE_DEVICE_TABLE_SIZE
;
i
++
)
{
if
(
nodeId
==
emberAfDeviceTableGetNodeIdFromIndex
(
i
))
{
return
i
;
}
}
return
EMBER_AF_PLUGIN_DEVICE_TABLE_NULL_INDEX
;
}
static
uint16_t
findIndexFromEui64AndIndex
(
EmberEUI64
eui64
,
uint16_t
index
)
{
uint16_t
i
;
for
(
i
=
index
;
i
<
EMBER_AF_PLUGIN_DEVICE_TABLE_DEVICE_TABLE_SIZE
;
i
++
)
{
if
(
matchEui64
(
eui64
,
deviceTable
[
i
].
eui64
))
{
return
i
;
}
}
return
EMBER_AF_PLUGIN_DEVICE_TABLE_NULL_INDEX
;
}
uint16_t
emAfDeviceTableFindFirstEndpointNodeId
(
uint16_t
nodeId
)
{
return
findIndexFromNodeIdAndIndex
(
nodeId
,
0
);
}
uint16_t
emAfDeviceTableFindNextEndpoint
(
uint16_t
index
)
{
return
findIndexFromEui64AndIndex
(
deviceTable
[
index
].
eui64
,
index
+
1
);
}
uint16_t
emAfDeviceTableFindFirstEndpointIeee
(
EmberEUI64
eui64
)
{
return
findIndexFromEui64AndIndex
(
eui64
,
0
);
}
uint16_t
emberAfDeviceTableGetFirstIndexFromEui64
(
EmberEUI64
eui64
)
{
return
emAfDeviceTableFindFirstEndpointIeee
(
eui64
);
}
EmberAfStatus
emAfDeviceTableAddNewEndpoint
(
uint16_t
index
,
uint8_t
newEndpoint
)
{
uint16_t
newIndex
=
emAfDeviceTableFindFreeDeviceTableIndex
();
if
(
newIndex
==
EMBER_AF_PLUGIN_DEVICE_TABLE_NULL_INDEX
)
{
return
EMBER_ZCL_STATUS_FAILURE
;
}
emAfDeviceTableCopyDeviceTableEntry
(
index
,
newIndex
);
deviceTable
[
newIndex
].
endpoint
=
newEndpoint
;
return
EMBER_ZCL_STATUS_SUCCESS
;
}
uint16_t
emAfDeviceTableFindIndexNodeIdEndpoint
(
uint16_t
nodeId
,
uint8_t
endpoint
)
{
uint16_t
i
;
for
(
i
=
0
;
i
<
EMBER_AF_PLUGIN_DEVICE_TABLE_DEVICE_TABLE_SIZE
;
i
++
)
{
if
(
deviceTable
[
i
].
nodeId
==
nodeId
&&
deviceTable
[
i
].
endpoint
==
endpoint
)
{
return
i
;
}
}
return
EMBER_AF_PLUGIN_DEVICE_TABLE_NULL_INDEX
;
}
EmberAfPluginDeviceTableEntry
*
emberAfDeviceTableFindDeviceTableEntry
(
uint16_t
index
)
{
assert
(
index
<
EMBER_AF_PLUGIN_DEVICE_TABLE_NULL_NODE_ID
);
return
&
(
deviceTable
[
index
]);
}
void
emAfDeviceTableUpdateNodeId
(
uint16_t
currentNodeId
,
uint16_t
newNodeId
)
{
uint16_t
index
=
emAfDeviceTableFindFirstEndpointNodeId
(
currentNodeId
);
while
(
index
!=
EMBER_AF_PLUGIN_DEVICE_TABLE_NULL_INDEX
)
{
deviceTable
[
index
].
nodeId
=
newNodeId
;
index
=
emAfDeviceTableFindNextEndpoint
(
index
);
}
}
void
emAfDeviceTableUpdateDeviceState
(
uint16_t
index
,
uint8_t
newState
)
{
while
(
index
!=
EMBER_AF_PLUGIN_DEVICE_TABLE_NULL_INDEX
)
{
deviceTable
[
index
].
state
=
newState
;
index
=
emAfDeviceTableFindNextEndpoint
(
index
);
}
}
uint32_t
emberAfDeviceTableTimeSinceLastMessage
(
uint16_t
index
)
{
uint32_t
timeSinceLastMessage
=
halCommonGetInt32uMillisecondTick
();
timeSinceLastMessage
-=
deviceTable
[
index
].
lastMsgTimestamp
;
timeSinceLastMessage
/=
MILLISECOND_TICKS_PER_SECOND
;
return
timeSinceLastMessage
;
}
// AF Framework callbacks. This is where the plugin implements the callbacks.
void
emberAfPluginDeviceTableInitCallback
(
void
)
{
emAfDeviceTableInit
();
// Load on Init
emAfDeviceTableLoad
();
emberAfPluginDeviceTableInitialized
();
}
void
emberAfPluginDeviceTableStackStatusCallback
(
EmberStatus
status
)
{
// If we leave the network, this plugin needs to clear out all of its device
// state.
emberAfCorePrintln
(
"%d %d"
,
status
,
emberNetworkState
());
if
(
status
==
EMBER_NETWORK_DOWN
&&
emberNetworkState
()
==
EMBER_NO_NETWORK
)
{
emberAfCorePrintln
(
"DeviceTable: Clear State"
);
emberAfDeviceTableClear
();
//kk_device_table_clear();
}
}
// --------------------------------
// Save/Load the devices
void
emAfDeviceTableSave
(
void
)
{
#if defined(EZSP_HOST) && !defined(EMBER_TEST)
FILE
*
fp
;
EmberAfPluginDeviceTableEntry
*
deviceTable
=
emberAfDeviceTablePointer
();
uint8_t
i
;
uint8_t
j
;
// Save device table
fp
=
fopen
(
"devices.txt"
,
"w"
);
for
(
i
=
0
;
i
<
EMBER_AF_PLUGIN_DEVICE_TABLE_DEVICE_TABLE_SIZE
;
i
++
)
{
if
(
deviceTable
[
i
].
nodeId
!=
EMBER_AF_PLUGIN_DEVICE_TABLE_NULL_NODE_ID
)
{
fprintf
(
fp
,
"%x %x %x "
,
deviceTable
[
i
].
nodeId
,
deviceTable
[
i
].
endpoint
,
deviceTable
[
i
].
deviceId
);
for
(
j
=
0
;
j
<
8
;
j
++
)
{
fprintf
(
fp
,
"%x "
,
deviceTable
[
i
].
eui64
[
j
]);
}
for
(
j
=
0
;
j
<
EMBER_AF_PLUGIN_DEVICE_TABLE_CLUSTER_SIZE
;
j
++
)
{
fprintf
(
fp
,
"%x "
,
deviceTable
[
i
].
clusterIds
[
j
]);
}
fprintf
(
fp
,
"%d "
,
deviceTable
[
i
].
clusterOutStartPosition
);
}
}
// Write ffffffff to mark the end
fprintf
(
fp
,
"
\r\n
ffffffff
\r\n
"
);
fclose
(
fp
);
#endif // defined(EZSP_HOST) && !defined(EMBER_TEST)
}
void
emAfDeviceTableLoad
(
void
)
{
#if defined(EZSP_HOST) && !defined(EMBER_TEST)
uint16_t
i
;
uint16_t
j
;
FILE
*
fp
;
unsigned
int
data
,
data2
,
data3
;
EmberAfPluginDeviceTableEntry
*
deviceTable
=
emberAfDeviceTablePointer
();
fp
=
fopen
(
"devices.txt"
,
"r"
);
if
(
!
fp
)
{
return
;
}
for
(
i
=
0
;
i
<
EMBER_AF_PLUGIN_DEVICE_TABLE_DEVICE_TABLE_SIZE
&&
feof
(
fp
)
==
false
;
i
++
)
{
fscanf
(
fp
,
"%x %x %x"
,
&
data2
,
&
data
,
&
data3
);
deviceTable
[
i
].
endpoint
=
(
uint8_t
)
data
;
deviceTable
[
i
].
nodeId
=
(
uint16_t
)
data2
;
deviceTable
[
i
].
deviceId
=
(
uint16_t
)
data3
;
if
(
deviceTable
[
i
].
nodeId
!=
EMBER_AF_PLUGIN_DEVICE_TABLE_NULL_NODE_ID
)
{
for
(
j
=
0
;
j
<
8
;
j
++
)
{
fscanf
(
fp
,
"%x"
,
&
data
);
deviceTable
[
i
].
eui64
[
j
]
=
(
uint8_t
)
data
;
}
for
(
j
=
0
;
j
<
EMBER_AF_PLUGIN_DEVICE_TABLE_CLUSTER_SIZE
;
j
++
)
{
fscanf
(
fp
,
"%x"
,
&
data
);
deviceTable
[
i
].
clusterIds
[
j
]
=
(
uint16_t
)
data
;
}
fscanf
(
fp
,
"%d"
,
&
data
);
deviceTable
[
i
].
clusterOutStartPosition
=
(
uint16_t
)
data
;
deviceTable
[
i
].
state
=
EMBER_AF_PLUGIN_DEVICE_TABLE_STATE_JOINED
;
//kk_sub_tsl_add(deviceTable[i].eui64,TEST_PRODUCT_CODE);
}
deviceTable
[
i
].
lastMsgTimestamp
=
halCommonGetInt32uMillisecondTick
();
}
fclose
(
fp
);
// Set the rest of the device table to null.
for
(;
i
<
EMBER_AF_PLUGIN_DEVICE_TABLE_DEVICE_TABLE_SIZE
;
i
++
)
{
deviceTable
[
i
].
nodeId
=
EMBER_AF_PLUGIN_DEVICE_TABLE_NULL_NODE_ID
;
}
#endif // #if defined(EZSP_HOST) && !defined(EMBER_TEST)
}
// --------------------------------
// Message send section
// Command to send the CIE IEEE address to the IAS Zone cluster
void
emAfDeviceTableSendCieAddressWrite
(
EmberNodeId
nodeId
,
uint8_t
endpoint
)
{
EmberEUI64
eui64
;
uint8_t
outgoingBuffer
[
15
];
uint32_t
i
;
emberAfGetEui64
(
eui64
);
globalApsFrame
.
options
=
EMBER_AF_DEFAULT_APS_OPTIONS
;
globalApsFrame
.
clusterId
=
ZCL_IAS_ZONE_CLUSTER_ID
;
globalApsFrame
.
sourceEndpoint
=
0x01
;
globalApsFrame
.
destinationEndpoint
=
endpoint
;
outgoingBuffer
[
0
]
=
0x00
;
outgoingBuffer
[
1
]
=
emberAfNextSequence
();
outgoingBuffer
[
2
]
=
ZCL_WRITE_ATTRIBUTES_COMMAND_ID
;
outgoingBuffer
[
3
]
=
LOW_BYTE
(
ZCL_IAS_CIE_ADDRESS_ATTRIBUTE_ID
);
outgoingBuffer
[
4
]
=
HIGH_BYTE
(
ZCL_IAS_CIE_ADDRESS_ATTRIBUTE_ID
);
outgoingBuffer
[
5
]
=
ZCL_IEEE_ADDRESS_ATTRIBUTE_TYPE
;
for
(
i
=
0
;
i
<
8
;
i
++
)
{
outgoingBuffer
[
6
+
i
]
=
eui64
[
i
];
}
emberAfSendUnicast
(
EMBER_OUTGOING_DIRECT
,
nodeId
,
&
globalApsFrame
,
14
,
outgoingBuffer
);
}
void
emberAfDeviceTableCliIndexSendWithEndpoint
(
uint16_t
index
,
uint8_t
endpoint
)
{
EmberNodeId
nodeId
;
EmberStatus
status
;
nodeId
=
emberAfDeviceTableGetNodeIdFromIndex
(
index
);
emAfApsFrameEndpointSetup
(
emberAfPrimaryEndpoint
(),
endpoint
);
status
=
emberAfSendUnicast
(
EMBER_OUTGOING_DIRECT
,
nodeId
,
&
globalApsFrame
,
appZclBufferLen
,
appZclBuffer
);
zclCmdIsBuilt
=
false
;
}
void
emberAfDeviceTableCliIndexSend
(
uint16_t
index
)
{
uint8_t
endpoint
=
emAfDeviceTableGetFirstEndpointFromIndex
(
index
);
emberAfDeviceTableCliIndexSendWithEndpoint
(
index
,
endpoint
);
}
void
emberAfDeviceTableSend
(
EmberEUI64
eui64
,
uint8_t
endpoint
)
{
uint16_t
index
=
emberAfDeviceTableGetFirstIndexFromEui64
(
eui64
);
if
(
index
!=
EMBER_AF_PLUGIN_DEVICE_TABLE_NULL_INDEX
)
{
emberAfDeviceTableCliIndexSendWithEndpoint
(
index
,
endpoint
);
}
}
void
emberAfDeviceTableCommandIndexSendWithEndpoint
(
uint16_t
index
,
uint8_t
endpoint
)
{
EmberNodeId
nodeId
;
EmberStatus
status
;
nodeId
=
emberAfDeviceTableGetNodeIdFromIndex
(
index
);
if
(
emberAfCurrentCommand
()
==
NULL
)
{
emAfCommandApsFrame
->
sourceEndpoint
=
emberAfPrimaryEndpoint
();
}
else
{
emAfCommandApsFrame
->
sourceEndpoint
=
emberAfCurrentEndpoint
();
}
emAfCommandApsFrame
->
destinationEndpoint
=
endpoint
;
emberAfCorePrintln
(
"device table send with ep: 0x%2X, %d"
,
nodeId
,
endpoint
);
status
=
emberAfSendCommandUnicast
(
EMBER_OUTGOING_DIRECT
,
nodeId
);
zclCmdIsBuilt
=
false
;
}
void
emberAfDeviceTableCommandIndexSend
(
uint16_t
index
)
{
uint8_t
endpoint
=
emAfDeviceTableGetFirstEndpointFromIndex
(
index
);
emberAfDeviceTableCommandIndexSendWithEndpoint
(
index
,
endpoint
);
}
void
emberAfDeviceTableCommandSendWithEndpoint
(
EmberEUI64
eui64
,
uint8_t
endpoint
)
{
uint16_t
index
=
emberAfDeviceTableGetFirstIndexFromEui64
(
eui64
);
emberAfDeviceTableCommandIndexSendWithEndpoint
(
index
,
endpoint
);
}
// Copyright 2016 Silicon Laboratories, Inc. *80*
#include PLATFORM_HEADER
#ifdef EZSP_HOST
// Includes needed for functions related to the EZSP host
#include "stack/include/error.h"
#include "stack/include/ember-types.h"
#include "app/util/ezsp/ezsp-protocol.h"
#include "app/util/ezsp/ezsp.h"
#include "app/util/ezsp/serial-interface.h"
#include "app/util/zigbee-framework/zigbee-device-common.h"
#else
#include "stack/include/ember.h"
#endif
#include "af.h"
#include "af-main.h"
#include "attribute-storage.h"
#include "common.h"
#include "hal/hal.h"
#include "app/util/serial/command-interpreter2.h"
#include "stack/include/event.h"
#include "app/framework/plugin/concentrator/source-route-host.h"
#include "app/framework/plugin/device-table/device-table.h"
#include "app/framework/plugin/device-table/device-table-internal.h"
#include "app/framework/util/util.h"
#include <stdlib.h>
#include <kk_test.h>
void
emAfDeviceTableSave
(
void
);
void
emAfDeviceTableLoad
(
void
);
// Framework message send global data
extern
uint8_t
appZclBuffer
[];
extern
uint16_t
appZclBufferLen
;
extern
bool
zclCmdIsBuilt
;
extern
EmberApsFrame
globalApsFrame
;
extern
void
emAfApsFrameEndpointSetup
(
uint8_t
srcEndpoint
,
uint8_t
dstEndpoint
);
static
EmberAfPluginDeviceTableEntry
deviceTable
[
EMBER_AF_PLUGIN_DEVICE_TABLE_DEVICE_TABLE_SIZE
];
EmberStatus
emberAfGetChildData
(
uint8_t
index
,
EmberChildData
*
childData
);
// Device discovery global declarations
void
emAfDeviceTableInitiateRouteRepair
(
EmberNodeId
nodeId
);
static
void
clearDeviceTableIndex
(
uint16_t
index
);
EmberAfPluginDeviceTableEntry
*
emberAfDeviceTablePointer
(
void
)
{
return
deviceTable
;
}
uint16_t
emberAfDeviceTableGetNodeIdFromIndex
(
uint16_t
index
)
{
EmberAfPluginDeviceTableEntry
*
deviceTable
=
emberAfDeviceTablePointer
();
assert
(
index
<
EMBER_AF_PLUGIN_DEVICE_TABLE_DEVICE_TABLE_SIZE
);
return
deviceTable
[
index
].
nodeId
;
}
uint8_t
emAfDeviceTableGetFirstEndpointFromIndex
(
uint16_t
index
)
{
assert
(
index
<
EMBER_AF_PLUGIN_DEVICE_TABLE_DEVICE_TABLE_SIZE
);
return
deviceTable
[
index
].
endpoint
;
}
static
void
matchReverseEui64
(
EmberEUI64
eui64a
,
EmberEUI64
eui64b
)
{
uint8_t
i
;
for
(
i
=
0
;
i
<
EUI64_SIZE
;
i
++
)
{
if
(
eui64a
[
i
]
!=
eui64b
[(
EUI64_SIZE
-
1
)
-
i
])
{
return
;
}
}
emberAfCorePrintln
(
"MATCH_EUI: EUI matches backwards"
);
emberAfCorePrint
(
"A:"
);
emAfDeviceTablePrintEUI64
(
eui64a
);
emberAfCorePrint
(
" B:"
);
emAfDeviceTablePrintEUI64
(
eui64b
);
emberAfCorePrintln
(
""
);
}
static
void
checkNullEui64
(
EmberEUI64
eui64a
,
EmberEUI64
eui64b
)
{
uint8_t
i
;
for
(
i
=
0
;
i
<
EUI64_SIZE
;
i
++
)
{
if
(
eui64a
[
i
]
!=
0xff
||
eui64b
[
i
]
!=
0xff
)
{
return
;
}
}
emberAfCorePrintln
(
"MatchEUI: two null EUI"
);
}
static
bool
matchEui64
(
EmberEUI64
a
,
EmberEUI64
b
)
{
checkNullEui64
(
a
,
b
);
if
(
MEMCOMPARE
(
a
,
b
,
EUI64_SIZE
)
==
0
)
{
return
true
;
}
else
{
// Test to see if the EUI64 is backwards
matchReverseEui64
(
a
,
b
);
return
false
;
}
}
bool
emberAfDeviceTableMatchEui64
(
EmberEUI64
eui64a
,
EmberEUI64
eui64b
)
{
return
matchEui64
(
eui64a
,
eui64b
);
}
static
void
unsetEui64
(
EmberEUI64
eui64
)
{
uint8_t
i
;
for
(
i
=
0
;
i
<
8
;
i
++
)
{
eui64
[
i
]
=
0xff
;
}
}
static
void
clearDeviceTableIndex
(
uint16_t
index
)
{
uint8_t
i
;
assert
(
index
<
EMBER_AF_PLUGIN_DEVICE_TABLE_DEVICE_TABLE_SIZE
);
deviceTable
[
index
].
nodeId
=
EMBER_AF_PLUGIN_DEVICE_TABLE_NULL_NODE_ID
;
unsetEui64
(
deviceTable
[
index
].
eui64
);
deviceTable
[
index
].
state
=
EMBER_AF_PLUGIN_DEVICE_TABLE_STATE_NULL
;
deviceTable
[
index
].
endpoint
=
0
;
for
(
i
=
0
;
i
<
EMBER_AF_PLUGIN_DEVICE_TABLE_CLUSTER_SIZE
;
i
++
)
{
deviceTable
[
index
].
clusterIds
[
i
]
=
ZCL_NULL_CLUSTER_ID
;
}
deviceTable
[
index
].
clusterOutStartPosition
=
0
;
}
void
emAfPluginDeviceTableDeleteEntry
(
uint16_t
index
)
{
uint16_t
currentIndex
;
while
(
index
!=
EMBER_AF_PLUGIN_DEVICE_TABLE_NULL_INDEX
)
{
currentIndex
=
index
;
// Need to compute the next index before deleting the current one. Or else
// the call to next endpoint will yield a bogus result.
index
=
emAfDeviceTableFindNextEndpoint
(
index
);
clearDeviceTableIndex
(
currentIndex
);
emberAfPluginDeviceTableIndexRemovedCallback
(
currentIndex
);
}
}
void
emAfDeviceTableInit
(
void
)
{
uint16_t
i
;
for
(
i
=
0
;
i
<
EMBER_AF_PLUGIN_DEVICE_TABLE_DEVICE_TABLE_SIZE
;
i
++
)
{
clearDeviceTableIndex
(
i
);
}
}
void
emberAfDeviceTableClear
(
void
)
{
emAfDeviceTableInit
();
emAfDeviceTableSave
();
//emberAfPluginDeviceTableClearedCallback();
}
uint16_t
emberAfDeviceTableGetIndexFromEui64AndEndpoint
(
EmberEUI64
eui64
,
uint8_t
endpoint
)
{
uint16_t
i
;
for
(
i
=
0
;
i
<
EMBER_AF_PLUGIN_DEVICE_TABLE_DEVICE_TABLE_SIZE
;
i
++
)
{
if
(
matchEui64
(
deviceTable
[
i
].
eui64
,
eui64
)
&&
deviceTable
[
i
].
endpoint
==
endpoint
)
{
return
i
;
}
}
return
EMBER_AF_PLUGIN_DEVICE_TABLE_NULL_INDEX
;
}
uint16_t
emberAfDeviceTableGetNodeIdFromEui64
(
EmberEUI64
eui64
)
{
uint16_t
i
;
for
(
i
=
0
;
i
<
EMBER_AF_PLUGIN_DEVICE_TABLE_DEVICE_TABLE_SIZE
;
i
++
)
{
if
(
matchEui64
(
deviceTable
[
i
].
eui64
,
eui64
)
)
{
return
deviceTable
[
i
].
nodeId
;
}
}
return
EMBER_AF_PLUGIN_DEVICE_TABLE_NULL_NODE_ID
;
}
bool
emberAfDeviceTableGetEui64FromNodeId
(
EmberNodeId
emberNodeId
,
EmberEUI64
eui64
)
{
uint16_t
i
;
for
(
i
=
0
;
i
<
EMBER_AF_PLUGIN_DEVICE_TABLE_DEVICE_TABLE_SIZE
;
i
++
)
{
if
(
deviceTable
[
i
].
nodeId
==
emberNodeId
)
{
MEMCOPY
(
eui64
,
deviceTable
[
i
].
eui64
,
EUI64_SIZE
);
return
true
;
}
}
return
false
;
}
uint16_t
emberAfDeviceTableGetIndexFromNodeId
(
EmberNodeId
emberNodeId
)
{
uint16_t
i
;
for
(
i
=
0
;
i
<
EMBER_AF_PLUGIN_DEVICE_TABLE_DEVICE_TABLE_SIZE
;
i
++
)
{
if
(
deviceTable
[
i
].
nodeId
==
emberNodeId
)
{
return
i
;
}
}
return
EMBER_AF_PLUGIN_DEVICE_TABLE_NULL_INDEX
;
}
uint16_t
emAfDeviceTableFindFreeDeviceTableIndex
(
void
)
{
uint16_t
i
;
for
(
i
=
0
;
i
<
EMBER_AF_PLUGIN_DEVICE_TABLE_DEVICE_TABLE_SIZE
;
i
++
)
{
if
(
deviceTable
[
i
].
nodeId
==
EMBER_AF_PLUGIN_DEVICE_TABLE_NULL_NODE_ID
)
{
return
i
;
}
}
return
EMBER_AF_PLUGIN_DEVICE_TABLE_NULL_INDEX
;
}
uint16_t
emberAfDeviceTableGetEndpointFromNodeIdAndEndpoint
(
EmberNodeId
emberNodeId
,
uint8_t
endpoint
)
{
uint16_t
i
;
for
(
i
=
0
;
i
<
EMBER_AF_PLUGIN_DEVICE_TABLE_DEVICE_TABLE_SIZE
;
i
++
)
{
if
(
deviceTable
[
i
].
nodeId
==
emberNodeId
&&
deviceTable
[
i
].
endpoint
==
endpoint
)
{
return
i
;
}
}
return
EMBER_AF_PLUGIN_DEVICE_TABLE_NULL_INDEX
;
}
void
emAfDeviceTableCopyDeviceTableEntry
(
uint16_t
fromIndex
,
uint16_t
toIndex
)
{
EmberAfPluginDeviceTableEntry
*
from
=
&
(
deviceTable
[
fromIndex
]);
EmberAfPluginDeviceTableEntry
*
to
=
&
(
deviceTable
[
toIndex
]);
// make sure the fromIndex is in the valud range.
assert
(
fromIndex
<
EMBER_AF_PLUGIN_DEVICE_TABLE_DEVICE_TABLE_SIZE
);
// make sure the fromIndex has a valid entry
assert
(
deviceTable
[
fromIndex
].
nodeId
!=
EMBER_AF_PLUGIN_DEVICE_TABLE_NULL_NODE_ID
);
// make sure the toIndex is in the valud range.
assert
(
toIndex
<
EMBER_AF_PLUGIN_DEVICE_TABLE_DEVICE_TABLE_SIZE
);
MEMCOPY
(
to
,
from
,
sizeof
(
EmberAfPluginDeviceTableEntry
));
}
uint8_t
emAfDeviceTableNumberOfEndpointsFromIndex
(
uint16_t
index
)
{
uint8_t
count
=
0
;
uint16_t
currentNodeId
=
emberAfDeviceTableGetNodeIdFromIndex
(
index
);
uint16_t
i
;
for
(
i
=
0
;
i
<
EMBER_AF_PLUGIN_DEVICE_TABLE_DEVICE_TABLE_SIZE
;
i
++
)
{
if
(
deviceTable
[
i
].
nodeId
==
currentNodeId
)
{
count
++
;
}
}
return
count
;
}
static
uint16_t
findIndexFromNodeIdAndIndex
(
uint16_t
nodeId
,
uint16_t
index
)
{
uint16_t
i
;
for
(
i
=
index
;
i
<
EMBER_AF_PLUGIN_DEVICE_TABLE_DEVICE_TABLE_SIZE
;
i
++
)
{
if
(
nodeId
==
emberAfDeviceTableGetNodeIdFromIndex
(
i
))
{
return
i
;
}
}
return
EMBER_AF_PLUGIN_DEVICE_TABLE_NULL_INDEX
;
}
static
uint16_t
findIndexFromEui64AndIndex
(
EmberEUI64
eui64
,
uint16_t
index
)
{
uint16_t
i
;
for
(
i
=
index
;
i
<
EMBER_AF_PLUGIN_DEVICE_TABLE_DEVICE_TABLE_SIZE
;
i
++
)
{
if
(
matchEui64
(
eui64
,
deviceTable
[
i
].
eui64
))
{
return
i
;
}
}
return
EMBER_AF_PLUGIN_DEVICE_TABLE_NULL_INDEX
;
}
uint16_t
emAfDeviceTableFindFirstEndpointNodeId
(
uint16_t
nodeId
)
{
return
findIndexFromNodeIdAndIndex
(
nodeId
,
0
);
}
uint16_t
emAfDeviceTableFindNextEndpoint
(
uint16_t
index
)
{
return
findIndexFromEui64AndIndex
(
deviceTable
[
index
].
eui64
,
index
+
1
);
}
uint16_t
emAfDeviceTableFindFirstEndpointIeee
(
EmberEUI64
eui64
)
{
return
findIndexFromEui64AndIndex
(
eui64
,
0
);
}
uint16_t
emberAfDeviceTableGetFirstIndexFromEui64
(
EmberEUI64
eui64
)
{
return
emAfDeviceTableFindFirstEndpointIeee
(
eui64
);
}
EmberAfStatus
emAfDeviceTableAddNewEndpoint
(
uint16_t
index
,
uint8_t
newEndpoint
)
{
uint16_t
newIndex
=
emAfDeviceTableFindFreeDeviceTableIndex
();
if
(
newIndex
==
EMBER_AF_PLUGIN_DEVICE_TABLE_NULL_INDEX
)
{
return
EMBER_ZCL_STATUS_FAILURE
;
}
emAfDeviceTableCopyDeviceTableEntry
(
index
,
newIndex
);
deviceTable
[
newIndex
].
endpoint
=
newEndpoint
;
return
EMBER_ZCL_STATUS_SUCCESS
;
}
uint16_t
emAfDeviceTableFindIndexNodeIdEndpoint
(
uint16_t
nodeId
,
uint8_t
endpoint
)
{
uint16_t
i
;
for
(
i
=
0
;
i
<
EMBER_AF_PLUGIN_DEVICE_TABLE_DEVICE_TABLE_SIZE
;
i
++
)
{
if
(
deviceTable
[
i
].
nodeId
==
nodeId
&&
deviceTable
[
i
].
endpoint
==
endpoint
)
{
return
i
;
}
}
return
EMBER_AF_PLUGIN_DEVICE_TABLE_NULL_INDEX
;
}
EmberAfPluginDeviceTableEntry
*
emberAfDeviceTableFindDeviceTableEntry
(
uint16_t
index
)
{
assert
(
index
<
EMBER_AF_PLUGIN_DEVICE_TABLE_NULL_NODE_ID
);
return
&
(
deviceTable
[
index
]);
}
void
emAfDeviceTableUpdateNodeId
(
uint16_t
currentNodeId
,
uint16_t
newNodeId
)
{
uint16_t
index
=
emAfDeviceTableFindFirstEndpointNodeId
(
currentNodeId
);
while
(
index
!=
EMBER_AF_PLUGIN_DEVICE_TABLE_NULL_INDEX
)
{
deviceTable
[
index
].
nodeId
=
newNodeId
;
index
=
emAfDeviceTableFindNextEndpoint
(
index
);
}
}
void
emAfDeviceTableUpdateDeviceState
(
uint16_t
index
,
uint8_t
newState
)
{
while
(
index
!=
EMBER_AF_PLUGIN_DEVICE_TABLE_NULL_INDEX
)
{
deviceTable
[
index
].
state
=
newState
;
index
=
emAfDeviceTableFindNextEndpoint
(
index
);
}
}
uint32_t
emberAfDeviceTableTimeSinceLastMessage
(
uint16_t
index
)
{
uint32_t
timeSinceLastMessage
=
halCommonGetInt32uMillisecondTick
();
timeSinceLastMessage
-=
deviceTable
[
index
].
lastMsgTimestamp
;
timeSinceLastMessage
/=
MILLISECOND_TICKS_PER_SECOND
;
return
timeSinceLastMessage
;
}
// AF Framework callbacks. This is where the plugin implements the callbacks.
void
emberAfPluginDeviceTableInitCallback
(
void
)
{
emAfDeviceTableInit
();
// Load on Init
emAfDeviceTableLoad
();
emberAfPluginDeviceTableInitialized
();
}
void
emberAfPluginDeviceTableStackStatusCallback
(
EmberStatus
status
)
{
// If we leave the network, this plugin needs to clear out all of its device
// state.
emberAfCorePrintln
(
"%d %d"
,
status
,
emberNetworkState
());
if
(
status
==
EMBER_NETWORK_DOWN
&&
emberNetworkState
()
==
EMBER_NO_NETWORK
)
{
emberAfCorePrintln
(
"DeviceTable: Clear State"
);
emberAfDeviceTableClear
();
//kk_device_table_clear();
}
}
// --------------------------------
// Save/Load the devices
void
emAfDeviceTableSave
(
void
)
{
#if defined(EZSP_HOST) && !defined(EMBER_TEST)
FILE
*
fp
;
EmberAfPluginDeviceTableEntry
*
deviceTable
=
emberAfDeviceTablePointer
();
uint8_t
i
;
uint8_t
j
;
// Save device table
fp
=
fopen
(
"devices.txt"
,
"w"
);
for
(
i
=
0
;
i
<
EMBER_AF_PLUGIN_DEVICE_TABLE_DEVICE_TABLE_SIZE
;
i
++
)
{
if
(
deviceTable
[
i
].
nodeId
!=
EMBER_AF_PLUGIN_DEVICE_TABLE_NULL_NODE_ID
)
{
fprintf
(
fp
,
"%x %x %x "
,
deviceTable
[
i
].
nodeId
,
deviceTable
[
i
].
endpoint
,
deviceTable
[
i
].
deviceId
);
for
(
j
=
0
;
j
<
8
;
j
++
)
{
fprintf
(
fp
,
"%x "
,
deviceTable
[
i
].
eui64
[
j
]);
}
for
(
j
=
0
;
j
<
EMBER_AF_PLUGIN_DEVICE_TABLE_CLUSTER_SIZE
;
j
++
)
{
fprintf
(
fp
,
"%x "
,
deviceTable
[
i
].
clusterIds
[
j
]);
}
fprintf
(
fp
,
"%d "
,
deviceTable
[
i
].
clusterOutStartPosition
);
}
}
// Write ffffffff to mark the end
fprintf
(
fp
,
"
\r\n
ffffffff
\r\n
"
);
fclose
(
fp
);
#endif // defined(EZSP_HOST) && !defined(EMBER_TEST)
}
void
emAfDeviceTableLoad
(
void
)
{
#if defined(EZSP_HOST) && !defined(EMBER_TEST)
uint16_t
i
;
uint16_t
j
;
FILE
*
fp
;
unsigned
int
data
,
data2
,
data3
;
EmberAfPluginDeviceTableEntry
*
deviceTable
=
emberAfDeviceTablePointer
();
fp
=
fopen
(
"devices.txt"
,
"r"
);
if
(
!
fp
)
{
return
;
}
for
(
i
=
0
;
i
<
EMBER_AF_PLUGIN_DEVICE_TABLE_DEVICE_TABLE_SIZE
&&
feof
(
fp
)
==
false
;
i
++
)
{
fscanf
(
fp
,
"%x %x %x"
,
&
data2
,
&
data
,
&
data3
);
deviceTable
[
i
].
endpoint
=
(
uint8_t
)
data
;
deviceTable
[
i
].
nodeId
=
(
uint16_t
)
data2
;
deviceTable
[
i
].
deviceId
=
(
uint16_t
)
data3
;
if
(
deviceTable
[
i
].
nodeId
!=
EMBER_AF_PLUGIN_DEVICE_TABLE_NULL_NODE_ID
)
{
for
(
j
=
0
;
j
<
8
;
j
++
)
{
fscanf
(
fp
,
"%x"
,
&
data
);
deviceTable
[
i
].
eui64
[
j
]
=
(
uint8_t
)
data
;
}
for
(
j
=
0
;
j
<
EMBER_AF_PLUGIN_DEVICE_TABLE_CLUSTER_SIZE
;
j
++
)
{
fscanf
(
fp
,
"%x"
,
&
data
);
deviceTable
[
i
].
clusterIds
[
j
]
=
(
uint16_t
)
data
;
}
fscanf
(
fp
,
"%d"
,
&
data
);
deviceTable
[
i
].
clusterOutStartPosition
=
(
uint16_t
)
data
;
deviceTable
[
i
].
state
=
EMBER_AF_PLUGIN_DEVICE_TABLE_STATE_JOINED
;
//kk_sub_tsl_add(deviceTable[i].eui64,TEST_PRODUCT_CODE);
}
deviceTable
[
i
].
lastMsgTimestamp
=
halCommonGetInt32uMillisecondTick
();
}
fclose
(
fp
);
// Set the rest of the device table to null.
for
(;
i
<
EMBER_AF_PLUGIN_DEVICE_TABLE_DEVICE_TABLE_SIZE
;
i
++
)
{
deviceTable
[
i
].
nodeId
=
EMBER_AF_PLUGIN_DEVICE_TABLE_NULL_NODE_ID
;
}
#endif // #if defined(EZSP_HOST) && !defined(EMBER_TEST)
}
// --------------------------------
// Message send section
// Command to send the CIE IEEE address to the IAS Zone cluster
void
emAfDeviceTableSendCieAddressWrite
(
EmberNodeId
nodeId
,
uint8_t
endpoint
)
{
EmberEUI64
eui64
;
uint8_t
outgoingBuffer
[
15
];
uint32_t
i
;
emberAfGetEui64
(
eui64
);
globalApsFrame
.
options
=
EMBER_AF_DEFAULT_APS_OPTIONS
;
globalApsFrame
.
clusterId
=
ZCL_IAS_ZONE_CLUSTER_ID
;
globalApsFrame
.
sourceEndpoint
=
0x01
;
globalApsFrame
.
destinationEndpoint
=
endpoint
;
outgoingBuffer
[
0
]
=
0x00
;
outgoingBuffer
[
1
]
=
emberAfNextSequence
();
outgoingBuffer
[
2
]
=
ZCL_WRITE_ATTRIBUTES_COMMAND_ID
;
outgoingBuffer
[
3
]
=
LOW_BYTE
(
ZCL_IAS_CIE_ADDRESS_ATTRIBUTE_ID
);
outgoingBuffer
[
4
]
=
HIGH_BYTE
(
ZCL_IAS_CIE_ADDRESS_ATTRIBUTE_ID
);
outgoingBuffer
[
5
]
=
ZCL_IEEE_ADDRESS_ATTRIBUTE_TYPE
;
for
(
i
=
0
;
i
<
8
;
i
++
)
{
outgoingBuffer
[
6
+
i
]
=
eui64
[
i
];
}
emberAfSendUnicast
(
EMBER_OUTGOING_DIRECT
,
nodeId
,
&
globalApsFrame
,
14
,
outgoingBuffer
);
}
void
emberAfDeviceTableCliIndexSendWithEndpoint
(
uint16_t
index
,
uint8_t
endpoint
)
{
EmberNodeId
nodeId
;
EmberStatus
status
;
nodeId
=
emberAfDeviceTableGetNodeIdFromIndex
(
index
);
emAfApsFrameEndpointSetup
(
emberAfPrimaryEndpoint
(),
endpoint
);
status
=
emberAfSendUnicast
(
EMBER_OUTGOING_DIRECT
,
nodeId
,
&
globalApsFrame
,
appZclBufferLen
,
appZclBuffer
);
zclCmdIsBuilt
=
false
;
}
void
emberAfDeviceTableCliIndexSend
(
uint16_t
index
)
{
uint8_t
endpoint
=
emAfDeviceTableGetFirstEndpointFromIndex
(
index
);
emberAfDeviceTableCliIndexSendWithEndpoint
(
index
,
endpoint
);
}
void
emberAfDeviceTableSend
(
EmberEUI64
eui64
,
uint8_t
endpoint
)
{
uint16_t
index
=
emberAfDeviceTableGetFirstIndexFromEui64
(
eui64
);
if
(
index
!=
EMBER_AF_PLUGIN_DEVICE_TABLE_NULL_INDEX
)
{
emberAfDeviceTableCliIndexSendWithEndpoint
(
index
,
endpoint
);
}
}
void
emberAfDeviceTableCommandIndexSendWithEndpoint
(
uint16_t
index
,
uint8_t
endpoint
)
{
EmberNodeId
nodeId
;
EmberStatus
status
;
nodeId
=
emberAfDeviceTableGetNodeIdFromIndex
(
index
);
if
(
emberAfCurrentCommand
()
==
NULL
)
{
emAfCommandApsFrame
->
sourceEndpoint
=
emberAfPrimaryEndpoint
();
}
else
{
emAfCommandApsFrame
->
sourceEndpoint
=
emberAfCurrentEndpoint
();
}
emAfCommandApsFrame
->
destinationEndpoint
=
endpoint
;
emberAfCorePrintln
(
"device table send with ep: 0x%2X, %d"
,
nodeId
,
endpoint
);
status
=
emberAfSendCommandUnicast
(
EMBER_OUTGOING_DIRECT
,
nodeId
);
zclCmdIsBuilt
=
false
;
}
void
emberAfDeviceTableCommandIndexSend
(
uint16_t
index
)
{
uint8_t
endpoint
=
emAfDeviceTableGetFirstEndpointFromIndex
(
index
);
emberAfDeviceTableCommandIndexSendWithEndpoint
(
index
,
endpoint
);
}
void
emberAfDeviceTableCommandSendWithEndpoint
(
EmberEUI64
eui64
,
uint8_t
endpoint
)
{
uint16_t
index
=
emberAfDeviceTableGetFirstIndexFromEui64
(
eui64
);
emberAfDeviceTableCommandIndexSendWithEndpoint
(
index
,
endpoint
);
}
process_check.sh
View file @
2a352fcf
#!/bin/sh
#判断进程是否存在,如果不存在就启动它
while
true
do
sleep
30
PIDS
=
`
ps|grep kk_midware |grep
-v
grep
|
awk
'{print $1}'
`
if
[
"
$PIDS
"
!=
""
]
;
then
echo
"kk_midware is runing!"
else
/home/kk/kk_midware
>
/dev/null 2>&1 &
#运行进程
fi
sleep
30
PIDS
=
`
ps|grep kcloud |grep
-v
grep
|
awk
'{print $1}'
`
if
[
"
$PIDS
"
!=
""
]
;
then
echo
"kcloud is runing!"
else
/home/kk/kcloud
>
/dev/null 2>&1 &
#运行进程
fi
done
#!/bin/sh
#判断进程是否存在,如果不存在就启动它
while
true
do
sleep
30
PIDS
=
`
ps|grep kk_midware |grep
-v
grep
|
awk
'{print $1}'
`
if
[
"
$PIDS
"
!=
""
]
;
then
echo
"kk_midware is runing!"
else
/home/kk/kk_midware
>
/dev/null 2>&1 &
#运行进程
fi
sleep
30
PIDS
=
`
ps|grep kcloud |grep
-v
grep
|
awk
'{print $1}'
`
if
[
"
$PIDS
"
!=
""
]
;
then
echo
"kcloud is runing!"
else
/home/kk/kcloud
>
/dev/null 2>&1 &
#运行进程
fi
done
rc.local
View file @
2a352fcf
# Put your custom commands here that should be executed once
# the system init finished. By default this file does nothing.
nanomsg_File="/home/kk/lib/libnanomsg.so.5"
ev_File="/home/kk/lib/libev.so.4"
cd /sbin/
insmod /sbin/ssd1306-revision.ko
/sbin/oled >/dev/null 2>&1 &
sleep 1
export LD_LIBRARY_PATH=/home/kk/lib
cd /home/kk/lib
if [ ! -f "$nanomsg_File" ]; then
ln libnanomsg.so libnanomsg.so.5
fi
if [ ! -f "$ev_File" ]; then
ln libev.so libev.so.4
fi
CCU_ID=`cat /etc/dropbear/accessory/hj/hj_ccuid`
/sbin/logread -f -r 120.55.149.201 514 -p /var/run/logread.cloud_log.pid -u -h $CCU_ID >/dev/null 2>&1 &
/sbin/logread -f -e "ccu_err_info" -F /etc/dropbear/accessory/hj/err.log -p /var/run/logread.err_log.pid -S 512 >/dev/null 2>&1 &
sleep 1
/home/kk/run.sh >/dev/null 2>&1 &
sleep 10
/home/kk/process_check.sh >/dev/null 2>&1 &
cd /sbin
/sbin/logd-check.sh >/dev/null 2>&1 &
sleep 1
ntpd -n -q -d -p stdtime.gov.hk &
exit 0
# Put your custom commands here that should be executed once
# the system init finished. By default this file does nothing.
nanomsg_File="/home/kk/lib/libnanomsg.so.5"
ev_File="/home/kk/lib/libev.so.4"
cd /sbin/
insmod /sbin/ssd1306-revision.ko
/sbin/oled >/dev/null 2>&1 &
sleep 1
export LD_LIBRARY_PATH=/home/kk/lib
cd /home/kk/lib
if [ ! -f "$nanomsg_File" ]; then
ln libnanomsg.so libnanomsg.so.5
fi
if [ ! -f "$ev_File" ]; then
ln libev.so libev.so.4
fi
CCU_ID=`cat /etc/dropbear/accessory/hj/hj_ccuid`
/sbin/logread -f -r 120.55.149.201 514 -p /var/run/logread.cloud_log.pid -u -h $CCU_ID >/dev/null 2>&1 &
/sbin/logread -f -e "ccu_err_info" -F /etc/dropbear/accessory/hj/err.log -p /var/run/logread.err_log.pid -S 512 >/dev/null 2>&1 &
sleep 1
/home/kk/run.sh >/dev/null 2>&1 &
sleep 10
/home/kk/process_check.sh >/dev/null 2>&1 &
cd /sbin
/sbin/logd-check.sh >/dev/null 2>&1 &
sleep 1
ntpd -n -q -d -p stdtime.gov.hk &
exit 0
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment