update qcloud sdk

1. iot-hub sdk update to 3.2.0
2. iot-explorer update to 3.1.1
This commit is contained in:
daishengdong
2020-05-07 11:11:04 +08:00
parent c8e39739d3
commit 3e631cd96a
594 changed files with 47287 additions and 44165 deletions

View File

@@ -0,0 +1,120 @@
define CompLib_Map
$(eval \
COMP_LIB_COMPONENTS += \
$(if \
$(filter y,$(FEATURE_$(strip $(1)))),$(strip $(2)) \
) \
)
endef
define CompInc_Map
$(eval \
COMP_LIB_COMPONENTS_INCLUDES += \
$(if \
$(filter y,$(FEATURE_$(strip $(1)))),$(strip $(2)) \
) \
)
endef
# 31, red. 32, green. 33, yellow. 34, blue. 35, magenta. 36, cyan. 37, white.
define Brief_Log
@if [ "$1" = "CC" ]; then \
if echo "$@"|grep -q "\.so$$"; then \
COLOR_MARK="\e[1;32m"; \
elif echo "$@"|grep -q "\.ko$$"; then \
COLOR_MARK="\e[1;35m"; \
else \
COLOR_MARK="\e[1;36m"; \
fi \
elif [ "$1" = "AR" ]; then \
COLOR_MARK="\e[1;33m"; \
elif [ "$1" = "LD" ]; then \
COLOR_MARK="\e[1;31m"; \
fi; \
echo -ne "$${COLOR_MARK}";
@if [ "$2" = "" ]; then \
FIRST_DEP="$(firstword $(filter-out FORCE,$?))"; \
SPACE_BAR=" "; \
if [ "$${FIRST_DEP}" != "" ]; then \
FIRST_DEP="$$(basename $${FIRST_DEP})"; \
fi; \
printf "\r%-40s%s\n" "[$1] $$(expr substr $$(basename $@) 1 30)" "<= $${FIRST_DEP} $${SPACE_BAR}"; \
else \
printf "\r%-40s%s\n" "[$1] $$(expr substr $(2) 1 30)" "<= $${FIRST_DEP} $${SPACE_BAR}"; \
fi
@for i in $(wordlist 2,100,$^); do \
printf "%-40s%s\n" "" " $$(basename $${i})"; \
done
@echo -ne "\e[0m"
endef
define CC_Log
@if [ "$2" = "" ]; then \
FIRST_DEP="$(firstword $(filter-out FORCE,$?))"; \
SPACE_BAR=" "; \
if [ "$${FIRST_DEP}" != "" ]; then \
FIRST_DEP="$$(basename $${FIRST_DEP})"; \
fi; \
printf "\r%-40s%s\n" "[CC] $$(expr substr $$(basename $@) 1 30)" "<= $${FIRST_DEP} $${SPACE_BAR}"; \
else \
printf "\r%-40s%s\n" "[CC] $$(expr substr $(2) 1 30)" "<= $${FIRST_DEP} $${SPACE_BAR}"; \
fi
@for i in $(wordlist 2,100,$^); do \
printf "%-40s%s\n" "" " $$(basename $${i})"; \
done
endef
define AR_Log
@if [ "$2" = "" ]; then \
FIRST_DEP="$(firstword $(filter-out FORCE,$?))"; \
SPACE_BAR=" "; \
if [ "$${FIRST_DEP}" != "" ]; then \
FIRST_DEP="$$(basename $${FIRST_DEP})"; \
fi; \
printf "\r%-40s%s\n" "[AR] $$(expr substr $$(basename $@) 1 30)" "<= $${FIRST_DEP} $${SPACE_BAR}"; \
else \
printf "\r%-40s%s\n" "[AR] $$(expr substr $(2) 1 30)" "<= $${FIRST_DEP} $${SPACE_BAR}"; \
fi
@for i in $(wordlist 2,100,$^); do \
printf "%-40s%s\n" "" " $$(basename $${i})"; \
done
endef
define Compile_Result
@echo ""
@echo "========================================================================="
@echo "o BUILD COMPLETE WITH FOLLOWING CONFIGS:"
@echo "----"
@( \
$(foreach V,$(SWITCH_VARS), \
$(if $(findstring FEATURE_,$(V)), \
printf "%-36s : %-s\n" " $(V)" "$($(V))"; \
) \
) )
@echo ""
@echo "o RELEASE PACKAGE LAYOUT:"
@echo "----"
@cd $(FINAL_DIR) && echo -n " " && pwd && echo "" && \
find . -print | awk '!/\.$$/ { \
for (i = 1; i < NF-1; i++) { \
printf("| "); \
} \
print "+-- "$$NF}' FS='/' | sed 's!\(.*\)! &!g'
@echo ""
@echo "o BINARY FOOTPRINT CONSIST:"
@echo "----"
@chmod a+x $(SCRIPT_DIR)/stats_static_lib.sh
@$(SCRIPT_DIR)/stats_static_lib.sh $(FINAL_DIR)/lib/$(COMP_LIB)
@$(SCRIPT_DIR)/stats_static_lib.sh $(FINAL_DIR)/lib/$(PLATFORM_LIB)
@echo "========================================================================="
@echo ""
endef

View File

@@ -0,0 +1,103 @@
include $(SCRIPT_DIR)/internal_make_funcs.mk
SETTING_VARS := \
BUILD_TYPE \
PLATFORM_CC \
PLATFORM_AR \
PLATFORM_OS \
SWITCH_VARS := \
FEATURE_MQTT_COMM_ENABLED \
FEATURE_COAP_COMM_ENABLED \
FEATURE_OTA_COMM_ENABLED \
FEATURE_MQTT_DEVICE_SHADOW \
FEATURE_AUTH_WITH_NOTLS \
FEATURE_GATEWAY_ENABLED \
FEATURE_LOG_UPLOAD_ENABLED \
FEATURE_MULTITHREAD_ENABLED \
FEATURE_DEV_DYN_REG_ENABLED \
FEATURE_AT_TCP_ENABLED \
FEATURE_AT_UART_RECV_IRQ \
FEATURE_AT_OS_USED \
FEATURE_AT_DEBUG \
FEATURE_DEBUG_DEV_INFO_USED \
FEATURE_OTA_USE_HTTPS \
$(foreach v, \
$(SETTING_VARS) $(SWITCH_VARS), \
$(eval export $(v)=$($(v))) \
)
$(foreach v, \
$(SWITCH_VARS), \
$(if $(filter y,$($(v))), \
$(eval CFLAGS += -D$(subst FEATURE_,,$(v)))) \
)
ifeq (debug,$(strip $(BUILD_TYPE)))
CFLAGS += -DIOT_DEBUG -g -O2
endif
ifneq (linux,$(strip $(PLATFORM_OS)))
ifeq (y,$(strip $(FEATURE_SDKTESTS_ENABLED)))
$(error FEATURE_SDKTESTS_ENABLED with gtest framework just supports to be enabled on PLATFORM_OS = linux!)
endif
else
ifeq (y,$(strip $(FEATURE_SDKTESTS_ENABLED)))
CFLAGS += -DSDKTESTS_ENABLED
endif
endif
ifeq (y,$(strip $(FEATURE_OTA_COMM_ENABLED)))
ifeq (MQTT,$(strip $(FEATURE_OTA_SIGNAL_CHANNEL)))
ifneq (y,$(strip $(FEATURE_MQTT_COMM_ENABLED)))
$(error FEATURE_OTA_SIGNAL_CHANNEL = MQTT requires FEATURE_MQTT_COMM_ENABLED = y!)
endif
CFLAGS += -DOTA_MQTT_CHANNEL
else
ifeq (COAP,$(strip $(FEATURE_OTA_SIGNAL_CHANNEL)))
ifneq (y,$(strip $(FEATURE_COAP_COMM_ENABLED)))
$(error FEATURE_OTA_SIGNAL_CHANNEL = COAP requires FEATURE_COAP_COMM_ENABLED = y!)
endif
CFLAGS += -DOTA_COAP_CHANNEL
else
$(error FEATURE_OTA_SIGNAL_CHANNEL must be MQTT or COAP!)
endif # COAP
endif # MQTT
endif # OTA Enabled
ifeq (CERT,$(strip $(FEATURE_AUTH_MODE)))
ifeq (y,$(strip $(FEATURE_AUTH_WITH_NOTLS)))
$(error FEATURE_AUTH_MODE = CERT requires FEATURE_AUTH_WITH_NOTLS = n!)
endif
CFLAGS += -DAUTH_MODE_CERT
else
ifeq (KEY,$(strip $(FEATURE_AUTH_MODE)))
CFLAGS += -DAUTH_MODE_KEY
else
$(error FEATURE_AUTH_MODE must be CERT or KEY!)
endif
endif # Auth mode
ifeq (y, $(strip $(FEATURE_SYSTEM_COMM_ENABLED)))
CFLAGS += -DSYSTEM_COMM
endif
ifeq (y, $(strip $(FEATURE_LOG_UPLOAD_ENABLED)))
CFLAGS += -DLOG_UPLOAD
endif
ifeq (y, $(strip $(FEATURE_AT_TCP_ENABLED)))
CFLAGS += -DAT_TCP_ENABLED
ifeq (y, $(strip $(FEATURE_AT_UART_RECV_IRQ)))
CFLAGS += -DAT_UART_RECV_IRQ
endif
ifeq (y, $(strip $(FEATURE_AT_OS_USED)))
CFLAGS += -DAT_OS_USED
endif
ifeq (y, $(strip $(FEATURE_AT_DEBUG)))
CFLAGS += -DFEATURE_AT_DEBUG
endif
endif

View File

@@ -0,0 +1,5 @@
.PHONY: run_demo_test demo_test_clean run_unit_test run_multi_thread_test \
coap_run_demo_test coap_demo_test_clean
tests: run_demo_test run_unit_test run_multi_thread_test coap_run_demo_test

View File

@@ -0,0 +1,104 @@
iot_sdk_objects = $(patsubst %.c,%.o, $(IOTSDK_SRC_FILES))
iot_platform_objects = $(patsubst %.c,%.o, $(IOTPLATFORM_SRC_FILES))
.PHONY: config mbedtls clean final-out samples tests
all: config mbedtls ${COMP_LIB} ${PLATFORM_LIB} final-out samples tests
$(call Compile_Result)
${COMP_LIB}: ${iot_sdk_objects}
$(call Brief_Log,"AR")
$(TOP_Q) \
$(AR) rcs $@ $(iot_sdk_objects)
$(TOP_Q) \
rm ${iot_sdk_objects}
${PLATFORM_LIB}: ${iot_platform_objects}
$(call Brief_Log,"AR")
$(TOP_Q) \
$(AR) rcs $@ $(iot_platform_objects)
$(TOP_Q) \
rm ${iot_platform_objects}
config:
$(TOP_Q) \
mkdir -p ${TEMP_DIR}
mbedtls:
ifeq (,$(filter -DAUTH_WITH_NOTLS,$(CFLAGS)))
$(TOP_Q) \
make -s -C $(THIRD_PARTY_PATH)/mbedtls lib -e CC=$(PLATFORM_CC) AR=$(PLATFORM_AR)
$(TOP_Q) \
cp -RP $(THIRD_PARTY_PATH)/mbedtls/library/libmbedtls.* \
$(THIRD_PARTY_PATH)/mbedtls/library/libmbedx509.* \
$(THIRD_PARTY_PATH)/mbedtls/library/libmbedcrypto.* \
$(TEMP_DIR)
$(TOP_Q) \
cd $(TEMP_DIR) && $(AR) x libmbedtls.a \
&& $(AR) x libmbedx509.a \
&& $(AR) x libmbedcrypto.a
endif
${iot_sdk_objects}:%.o:%.c
$(TOP_Q) echo '' > $(TOP_DIR)/include/config.h
$(call Brief_Log,"CC")
$(TOP_Q) \
$(PLATFORM_CC) $(CFLAGS) -c $^ -o $@
${iot_platform_objects}:%.o:%.c
$(call Brief_Log,"CC")
$(TOP_Q) \
$(PLATFORM_CC) $(CFLAGS) -c $^ -o $@
final-out :
$(TOP_Q) \
mkdir -p ${FINAL_DIR} ${DIST_DIR} ${FINAL_DIR}/lib \
${FINAL_DIR}/include ${FINAL_DIR}/bin
$(TOP_Q) \
mv ${COMP_LIB} ${FINAL_DIR}/lib/ && \
mv ${PLATFORM_LIB} ${FINAL_DIR}/lib
$(TOP_Q) \
cp -rf $(TOP_DIR)/include $(FINAL_DIR)/
$(TOP_Q) \
cp -rf $(TOP_DIR)/certs $(FINAL_DIR)/bin/
ifeq (,$(filter -DAUTH_WITH_NOTLS,$(CFLAGS)))
$(TOP_Q) \
mv ${TEMP_DIR}/*.a ${FINAL_DIR}/lib/
endif
$(TOP_Q) \
rm -rf ${TEMP_DIR}
#include $(SCRIPT_DIR)/rules-tests.mk
samples:
$(TOP_Q) \
make -s -C $(SAMPLE_DIR)
TLSDIR = $(THIRD_PARTY_PATH)/mbedtls
clean:
$(TOP_Q) \
rm -rf ${TEMP_DIR}
$(TOP_Q) \
rm -rf ${DIST_DIR}
ifeq (,$(filter -DAUTH_WITH_NOTLS,$(CFLAGS)))
ifeq ($(TLSDIR), $(wildcard $(THIRD_PARTY_PATH)/mbedtls))
$(TOP_Q) \
make -s -C $(THIRD_PARTY_PATH)/mbedtls clean
endif
endif
ifeq (,$(filter -DSDKTESTS_ENABLED,$(CFLAGS)))
$(TOP_Q) \
rm -rf $(TEST_LIB_DIR)
endif

View File

@@ -0,0 +1,65 @@
#! /bin/bash
TARGET=$1
TEMPD=$(mktemp -d -t STATD-XXXX)
TEMPF=$(mktemp -t STATF-XXXX)
#echo "TARGET = ${TARGET}"
#echo "STAGED = ${STAGED}"
#echo "TEMPD = ${TEMPD}"
if [ ! -f ${TARGET} ] || [ ! -d ${STAGED} ]; then
echo "Invalid Env"
exit 1
fi
cp ${TARGET} ${TEMPD}
cd ${TEMPD}
ar xf $(basename ${TARGET})
rm -f $(basename ${TARGET})
${STRIP} *.o > /dev/null 2>&1
NAME=$1
for obj in $(ls *.o); do
dir=$(find ${STAGED} -name ${obj}|xargs dirname|xargs basename)
printf "%-12s %-32s %s\n" $(basename $1) ${obj} $(du -b ${obj}|awk '{ print $1 }')
done | sort > ${TEMPF}
MODS=$(cat ${TEMPF}|awk '{ print $1 }'|sort -u)
TOTAL=$(cat ${TEMPF}|awk '{ sum += $3 } END { print sum }')
# echo "TOTAL = ${TOTAL}"
SMODS=$( \
for mod in ${MODS}; do \
MSIZE=$(grep "^${mod}" ${TEMPF}|awk '{ sum += $3 } END { print sum }'); \
printf "%-8s %s\n" \
$(awk -v a=${MSIZE} -v b=${TOTAL} 'BEGIN { printf("%.2f%%\n", a/b*100); }') \
"${mod}"; \
done | sort -nr | awk '{ print $2 }' \
)
echo ""
for mod in ${SMODS}; do
MSIZE=$(grep "^${mod}" ${TEMPF}|awk '{ sum += $3 } END { print sum }')
OBJS=$(grep "^${mod}" ${TEMPF}|awk '{ print $2 }')
for obj in ${OBJS}; do
FSIZE=$(grep "\<${obj}\>" ${TEMPF}|awk '{ print $3 }')
printf " %-8s %28s | %-8s %8s %-8s\n" \
$(awk -v a=${FSIZE} -v b=${MSIZE} 'BEGIN { printf("%.2f%%\n", a/b*100); }') \
"${obj}" "${mod}" "${FSIZE} /" "${MSIZE}"
done | sort -nr
echo " -----------------------------------------------------------------"
done
echo ""
for mod in ${MODS}; do
MSIZE=$(grep "^${mod}" ${TEMPF}|awk '{ sum += $3 } END { print sum }')
printf " %-8s %-12s %16s\n" \
$(awk -v a=${MSIZE} -v b=${TOTAL} 'BEGIN { printf("%.2f%%\n", a/b*100); }') \
"[ ${mod} ]" "${MSIZE} Bytes"
done | sort -nr
cd "${OLDPWD}"
rm -rf ${TEMPD}
rm -f ${TEMPF}

View File

@@ -0,0 +1,11 @@
#!/bin/bash
GOOGLE_TEST="external_libs/googletest"
if [ ! -d ${GOOGLE_TEST} ]; then
git clone -q packages/gtest_module.git ${GOOGLE_TEST}
else
cd ${GOOGLE_TEST}
git pull -q
cd -
fi

View File

@@ -0,0 +1,11 @@
#!/bin/bash
MBEDTLS_DIR="external_libs/mbedtls"
if [ ! -d ${MBEDTLS_DIR} ]; then
git clone -q packages/mbedtls_module.git ${MBEDTLS_DIR}
else
cd ${MBEDTLS_DIR}
git pull -q
cd -
fi

View File

@@ -0,0 +1,17 @@
#cmakedefine AUTH_MODE_CERT
#cmakedefine AUTH_MODE_KEY
#cmakedefine AUTH_WITH_NOTLS
#cmakedefine GATEWAY_ENABLED
#cmakedefine COAP_COMM_ENABLED
#cmakedefine OTA_MQTT_CHANNEL
#cmakedefine SYSTEM_COMM
#cmakedefine DEV_DYN_REG_ENABLED
#cmakedefine LOG_UPLOAD
#cmakedefine IOT_DEBUG
#cmakedefine DEBUG_DEV_INFO_USED
#cmakedefine AT_TCP_ENABLED
#cmakedefine AT_UART_RECV_IRQ
#cmakedefine AT_OS_USED
#cmakedefine AT_DEBUG
#cmakedefine OTA_USE_HTTPS
#cmakedefine MULTITHREAD_ENABLED

View File

@@ -0,0 +1,12 @@
#!/bin/bash
if [ $1 == "linux" ]; then
find $2 -type f -name "*.h" -print -o -name "*.c" -print | xargs -i sed -i '1 s/^\xef\xbb\xbf//' {}
echo "Convert source files to Unix format!!!"
elif [ $1 == "windows" ]; then
find $2 -type f -name "*.h" -print -o -name "*.c" -print | xargs -i sed -i '1 s/^/\xef\xbb\xbf&/' {}
echo "Convert source files to Windows format!!!"
else
echo "Invaild argument!"
echo "Please choose windows or linux !!!"
fi

View File

@@ -0,0 +1,352 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
import json
import sys
import os
import argparse
import glob
#import cStringIO
reload(sys)
sys.setdefaultencoding("utf-8")
try: import simplejson as json
except: import json
# {"version":"1.0","properties":[{"id":"light_switch","name":"电灯开关","desc":"控制电灯开灭","required":true,"mode":"rw","define":{"type":"bool","mapping":{"0":"关","1":"开"}}},{"id":"color","name":"颜色","desc":"灯光颜色","mode":"rw","define":{"type":"enum","mapping":{"0":"Red","1":"Green","2":"Blue"}}},{"id":"brightness","name":"颜色","desc":"灯光颜色","mode":"rw","define":{"type":"int","unit":"%","unitDesc":"亮度百分比","min":"0","max":"100"}},{"id":"name","name":"灯位置名称","desc":"灯位置名称:书房、客厅等","mode":"rw","required":true,"define":{"type":"string","min":"0","max":"64"}}]}
class TEMPLATE_CONSTANTS:
VERSION = "version"
TYPE = "type"
NAME = "name"
ID = "id"
MIN = "min"
MAX = "max"
DEFINE = "define"
PROPERTIES = "properties"
EVENTS = "events"
MAPPING = "mapping"
UNIT = "unit"
UNITDESC = "unitDesc"
REQUIRED = "required"
MODE = "mode"
class iot_enum:
def __init__(self, parent, name, index):
self.parent = parent
self.id = name
self.index = index
def get_c_macro_name(self):
return "e_{}_{}".format(self.parent.upper(), self.id.upper())
def get_define_str(self):
return "#define {} {}".format(self.get_c_macro_name(), self.index)
class iot_field:
def __init__(self,id, name, index, field_obj):
self.default_value = ""
self.enums = []
self.index = index
self.id = id
self.name = name
self.type_name = field_obj["define"]["type"]
if self.type_name == "bool":
self.type_define = "TYPE_DEF_TEMPLATE_BOOL"
self.type_id = "TYPE_TEMPLATE_BOOL"
self.default_value = "0"
elif self.type_name == "enum":
self.type_define = "TYPE_DEF_TEMPLATE_ENUM"
self.type_id = "TYPE_TEMPLATEENUM"
if TEMPLATE_CONSTANTS.DEFINE not in field_obj:
raise ValueError("错误:{} 字段定义中未找到枚举定义{} 字段".format(name, TEMPLATE_CONSTANTS.DEFINE))
enum_defs = field_obj["define"]["mapping"]
for enum_id in enum_defs:
enum_name = enum_defs[enum_id]
current_enum = iot_enum(self.id, enum_name, enum_id)
self.enums.append(current_enum)
if self.default_value == "":
self.default_value = enum_id
if self.default_value == "":
raise ValueError("错误:{} 字段默认值 {} 非法".format(name, field_obj["default"]))
elif self.type_name == "float":
self.type_define = "TYPE_DEF_TEMPLATE_FLOAT"
self.type_id = "TYPE_TEMPLATE_FLOAT"
self.min_value = field_obj["define"]["min"]
self.max_value = field_obj["define"]["max"]
self.default_value = field_obj["define"]["start"]
if float(self.default_value) < float(self.min_value) or float(self.default_value) > float(self.max_value):
raise ValueError("错误:{} 字段 default 指定的默认值超出 min~max 取值范围".format(name))
elif self.type_name == "int":
self.type_define = "TYPE_DEF_TEMPLATE_INT"
self.type_id = "TYPE_TEMPLATE_INT"
self.min_value = field_obj["define"]["min"]
self.max_value = field_obj["define"]["max"]
self.default_value = field_obj["define"]["start"]
if int(self.default_value) < int(self.min_value) or int(self.default_value) > int(self.max_value):
raise ValueError("错误:{} 字段 default 指定的默认值超出 min~max 取值范围".format(name))
elif self.type_name == "string":
self.type_define = "TYPE_DEF_TEMPLATE_STRING"
self.type_id = "TYPE_TEMPLATE_STRING"
self.min_value = field_obj["define"]["min"]
self.max_value = field_obj["define"]["max"]
self.default_value = "{'\\0'}"
elif self.type_name == "timestamp":
self.type_define = "TYPE_DEF_TEMPLATE_TIME"
self.type_id = "TYPE_TEMPLATE_TIME"
self.default_value = 0
else:
raise ValueError('{} 字段 数据类型 type={} 取值非法有效值应为bool,enum,int,float,string'.format(name, field_obj["type"]))
def get_id_c_macro_name(self):
return "TC_IOT_PROP_{}".format(self.id)
def get_id_c_member_name(self):
return "m_{}".format(self.id)
def get_id_default_value(self):
return "{}".format(self.default_value)
def get_id_define_str(self):
return "#define {} {}".format(self.get_id_c_macro_name(), self.index)
def get_struct_field_declare(self):
if self.type_id == "TYPE_TEMPLATE_STRING":
return "TYPE_DEF_TEMPLATE_STRING m_{}[{}+1];".format(self.id, str(self.max_value))
else:
return "{} m_{};".format(self.type_define, self.id)
def get_global_field_declare(self):
if self.type_id == "TYPE_TEMPLATE_STRING":
return "TYPE_DEF_TEMPLATE_STRING sg_{}[{}+1]={};".format(self.id, str(self.max_value),"{0}")
else:
return "{} sg_{} = {};".format(self.type_define, self.id, self.default_value)
def get_meta_define_str(self, var_name):
return '{{ "{}", &{}.{}, {} }},' \
.format(self.id, var_name, self.get_id_c_member_name(), self.type_id)
class iot_event:
def __init__(self,id, name, index, event):
self.index = index
self.id = id
self.name = name
self.event_type = event["type"]
self.desc = event["desc"]
self.event_properties = []
self.event_property_count = 0
for property in event["params"]:
self.event_properties.append(iot_field(property["id"], property["name"], self.event_property_count, property))
self.event_property_count += 1
def get_sigle_event_info(self):
event_info = ""
event_info += "\n id:{} name:\"{}\" type:\"{}\"\n".format(self.id, self.name, self.event_type)
event_info += " property_count:{} \n params:[".format(self.event_property_count)
for field in self.event_properties:
event_info += "\n para:{} type:{}".format(field.id, field.type_id)
event_info += "\n ]"
return event_info
def gen_sigle_event_info(self):
resault = ""
event_para_info = ""
event_property_info = ""
event_var_info = ""
for field in self.event_properties:
event_para_info += "static {}\n".format(field.get_global_field_declare())
event_property_info += "\n {"
if field.type_id == "TYPE_TEMPLATE_STRING":
event_property_info += ".key = \"{}\", .data = sg_{}, .type = {}".format(field.id, field.id, field.type_id)
else:
event_property_info += ".key = \"{}\", .data = &sg_{}, .type = {}".format(field.id, field.id, field.type_id)
event_property_info += "},"
event_var_info += "static DeviceProperty g_propertyEvent_{}[] = ".format(self.id)
resault += event_para_info + event_var_info + "{\n"+event_property_info + "\n};\n"
return resault
class iot_struct:
def __init__(self, model):
self.version = model["version"]
self.fields = []
self.field_id = 0
self.events = []
self.event_id = 0
for field_define in model["properties"]:
if TEMPLATE_CONSTANTS.NAME not in field_define:
raise ValueError("错误:字段定义中未找到 Name 字段")
self.fields.append(iot_field(field_define["id"], field_define["name"], self.field_id, field_define))
self.field_id += 1
for event in model["events"]:
if TEMPLATE_CONSTANTS.NAME not in event:
raise ValueError("错误:字段定义中未找到 Name 字段")
self.events.append(iot_event(event["id"], event["name"], self.event_id, event))
self.event_id += 1
def dump_data_info(self):
print("dump iot struct,counts:{}".format(self.field_id))
for temp_field in self.fields:
if temp_field.type_name == "enum":
print("{} {} {} {} ".format(temp_field.id, temp_field.type_name, temp_field.default_value, temp_field.type_define))
print("enums:{")
for enum in temp_field.enums:
print("{} ".format(enum.get_c_macro_name()))
print("}")
else:
print("{} {} {} {}\n".format(temp_field.id, temp_field.type_name, temp_field.default_value,
temp_field.type_define))
def dump_event_info(self):
count = 0
event_str = ""
event_str += ("#define EVENT_COUNTS ({})\n").format(self.event_id)
for event_d in self.events:
event_str += "{}\n".format(event_d.gen_sigle_event_info())
count += 1
return event_str
def data_config_macro_define(self, struct_Template="sDataPoint",var_gTemplate="sg_DataTemplate"):
define_str = ""
define_str += "/*-----------------data config start -------------------*/ \n\n"
define_str += "#define TOTAL_PROPERTY_COUNT {}\n\n".format(self.field_id)
define_str += "static {} {}[TOTAL_PROPERTY_COUNT];\n\n".format(struct_Template, var_gTemplate)
return define_str
def declare_product_data_struct(self, struct_name="ProductDataDefine", var_gname="sg_ProductData"):
result = ""
result += "typedef struct _" + struct_name + " {\n"
for field in self.fields:
result += " {}\n".format(field.get_struct_field_declare())
result += "} " + struct_name + ";\n\n"
result += "static " + struct_name + " "+var_gname + ";\n\n"
return result
def property_data_initializer(self, struct_name="ProductDataDefine", var_gProduct="sg_ProductData", var_gTemplate="sg_DataTemplate"):
count = 0
init_str = ""
init_str += "static void _init_data_template(void)\n{\n"
#init_str += " memset((void *) & {}, 0, sizeof({}));\n".format(var_gProduct, struct_name)
for field in self.fields:
if field.type_define == "TYPE_DEF_TEMPLATE_STRING":
init_str += " {}.{}[0] = {};\n".format(var_gProduct, field.get_id_c_member_name(), "'\\0'")
init_str += " {}[{}].data_property.data = {}.{};\n".format(var_gTemplate, count, var_gProduct, field.get_id_c_member_name())
else:
init_str += " {}.{} = {};\n".format(var_gProduct, field.get_id_c_member_name(),field.get_id_default_value())
init_str += " {}[{}].data_property.data = &{}.{};\n".format(var_gTemplate, count, var_gProduct, field.get_id_c_member_name())
init_str += " {}[{}].data_property.key = \"{}\";\n".format(var_gTemplate, count, field.id)
init_str += " {}[{}].data_property.type = {};\n\n".format(var_gTemplate, count, field.type_id)
count += 1
init_str += "};\n"
return init_str;
def gen_data_config(self):
data_config = ""
data_config +="{}".format(self.data_config_macro_define())
data_config +="{}".format(self.declare_product_data_struct())
data_config += "{}".format(self.property_data_initializer())
return data_config
def gen_event_config(self):
resault = ""
event_config = ""
events_var = ""
event_str = ""
event_config += ("\n#define EVENT_COUNTS ({})\n\n").format(self.event_id)
events_var += "\nstatic sEvent g_events[]={\n"
for event_d in self.events:
event_config += "{}\n".format(event_d.gen_sigle_event_info())
event_str += "\n {"
event_str += "\n .event_name = \"{}\",".format(event_d.id)
event_str += "\n .type = \"{}\",".format(event_d.event_type)
event_str += "\n .timestamp = 0,"
event_str += "\n .eventDataNum = sizeof(g_propertyEvent_{})/sizeof(g_propertyEvent_{}[0]),".format(event_d.id, event_d.id)
event_str += "\n .pEventData = g_propertyEvent_{},".format(event_d.id)
event_str +="\n },"
resault += event_config + events_var + event_str + "\n};\n"
return resault
def main():
parser = argparse.ArgumentParser(description='Iothub datatemplate and events config code generator.', usage='use "./codegen.py -c xx/config.json" gen config code')
parser.add_argument('-c','--config', dest='config',metavar='xxx.json', required=False,default='xxx.json',
help='copy the generated file (data_config.c and events_config.c) to datatemplate_sample dir '
'or your own code dir with datatemplate. '
'\nconfig file can be download from tencent iot-hub platfrom. https://console.cloud.tencent.com/iotcloud')
parser.add_argument('-d','--dest', dest='dest', required=False,default='.',
help='Dest directory for generated code files, no / at the end.')
args = parser.parse_args()
config_path = args.config
if not os.path.exists(config_path):
print(u"错误:配置文件不存在,请重新指定数据模板配置文件路径,请参考用法 ./codegen.py -c xx/data_template.json".format(config_path))
return 1
config_dir = os.path.dirname(config_path)
if config_dir:
config_dir += "/"
f = open(config_path, "r")
try:
thingmodel = json.load(f)
if 'properties' not in thingmodel:
thingmodel.properties = []
if 'events' not in thingmodel:
thingmodel.events = []
print(u"加载 {} 文件成功".format(config_path))
except ValueError as e:
print(u"错误:文件格式非法,请检查 {} 文件是否是 JSON 格式。".format(config_path))
return 1
if TEMPLATE_CONSTANTS.PROPERTIES not in thingmodel:
print(u"错误:{} 文件中未发现 DataTemplate 属性字段,请检查文件格式是否合法。".format(config_path))
return 1
try:
snippet = iot_struct(thingmodel)
output_data_config_file_name = args.dest + "/data_config.c"
output_file = open(output_data_config_file_name, "w")
output_file.write("{}".format(snippet.gen_data_config()))
output_file.close()
output_event_config_file_name = args.dest + "/events_config.c"
output_file = open(output_event_config_file_name, "w")
output_file.write("#ifdef EVENT_POST_ENABLED\n{}\n#endif\n".format(snippet.gen_event_config()))
output_file.close()
print(u"文件 {} 生成成功".format(output_data_config_file_name))
print(u"文件 {} 生成成功".format(output_event_config_file_name))
return 0
except ValueError as e:
print(e)
return 1
if __name__ == '__main__':
sys.exit(main())

View File

@@ -0,0 +1,230 @@
{
"version": "1.0",
"properties": [
{
"id": "time",
"name": "time",
"required": false,
"desc": "",
"mode": "rw",
"define": {
"type": "timestamp"
}
},
{
"id": "float",
"name": "float",
"required": false,
"desc": "",
"mode": "r",
"define": {
"type": "float",
"min": "-10",
"max": "10",
"start": "-5",
"step": "0.5",
"unit": "cm"
}
},
{
"id": "light_switch",
"name": "电灯开关",
"required": true,
"desc": "控制电灯开灭",
"mode": "rw",
"define": {
"type": "bool",
"mapping": {
"0": "关",
"1": "开"
}
}
},
{
"id": "color",
"name": "颜色",
"desc": "灯光颜色",
"mode": "rw",
"define": {
"type": "enum",
"mapping": {
"0": "Red",
"1": "Green",
"2": "Blue"
}
}
},
{
"id": "brightness",
"name": "亮度",
"required": false,
"desc": "灯光亮度",
"mode": "rw",
"define": {
"type": "int",
"min": "-9",
"max": "100",
"start": "-1",
"step": "5",
"unit": "cm"
}
},
{
"id": "name",
"name": "灯位置名称",
"desc": "灯位置名称:书房、客厅等",
"mode": "rw",
"required": true,
"define": {
"type": "string",
"min": "1",
"max": "64"
}
}
],
"events": [
{
"id": "all_function",
"name": "ALL_FUNCTION",
"required": false,
"desc": "",
"params": [
{
"id": "bool",
"name": "bool",
"desc": "",
"define": {
"type": "bool",
"mapping": {
"0": "关",
"1": "开"
}
}
},
{
"id": "int",
"name": "int",
"desc": "",
"define": {
"type": "int",
"min": "1",
"max": "100",
"start": "1",
"step": "1",
"unit": "cm"
}
},
{
"id": "str",
"name": "str",
"desc": "",
"define": {
"type": "string",
"min": "1",
"max": "64"
}
},
{
"id": "float",
"name": "float",
"desc": "",
"define": {
"type": "float",
"min": "0",
"max": "100",
"start": "0",
"step": "1.5",
"unit": "cm"
}
},
{
"id": "enum1",
"name": "enum1",
"desc": "",
"define": {
"type": "enum",
"mapping": {
"0": "color",
"1": "door"
}
}
},
{
"id": "time",
"name": "time",
"desc": "",
"define": {
"type": "timestamp"
}
}
],
"type": "alert"
},
{
"id": "status_report",
"name": "DeviceStatus",
"desc": "Report the device status我是中文",
"type": "info",
"required": true,
"params": [
{
"id": "status",
"name": "running_state",
"desc": "Report current device running state",
"define": {
"type": "bool",
"mapping": {
"0": "normal",
"1": "fault"
}
}
},
{
"id": "message",
"name": "Message",
"desc": "Some extra message",
"define": {
"type": "string",
"min": "1",
"max": "64"
}
}
]
},
{
"id": "hardware_fault",
"name": "Hardware_fault",
"required": false,
"desc": "Report hardware fault",
"params": [
{
"id": "name",
"name": "Name",
"desc": "Name like: memory,tf card, censors ...",
"define": {
"type": "string",
"min": "1",
"max": "64"
}
},
{
"id": "error_code",
"name": "Error_Code",
"desc": "Error code for fault",
"define": {
"type": "int",
"unit": "",
"step": "1",
"min": "0",
"max": "2000",
"start": "0"
}
}
],
"type": "fault"
}
],
"profile": {
"productID": "C0NEMO9UO0"
}
}

View File

@@ -0,0 +1,296 @@
#!/usr/bin/env python
#
#===- run-clang-tidy.py - Parallel clang-tidy runner ---------*- python -*--===#
#
# The LLVM Compiler Infrastructure
#
# This file is distributed under the University of Illinois Open Source
# License. See LICENSE.TXT for details.
#
#===------------------------------------------------------------------------===#
# FIXME: Integrate with clang-tidy-diff.py
"""
Parallel clang-tidy runner
==========================
Runs clang-tidy over all files in a compilation database. Requires clang-tidy
and clang-apply-replacements in $PATH.
Example invocations.
- Run clang-tidy on all files in the current working directory with a default
set of checks and show warnings in the cpp files and all project headers.
run-clang-tidy.py $PWD
- Fix all header guards.
run-clang-tidy.py -fix -checks=-*,llvm-header-guard
- Fix all header guards included from clang-tidy and header guards
for clang-tidy headers.
run-clang-tidy.py -fix -checks=-*,llvm-header-guard extra/clang-tidy \
-header-filter=extra/clang-tidy
Compilation database setup:
http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html
"""
from __future__ import print_function
import argparse
import glob
import json
import multiprocessing
import os
import re
import shutil
import subprocess
import sys
import tempfile
import threading
import traceback
import yaml
is_py2 = sys.version[0] == '2'
if is_py2:
import Queue as queue
else:
import queue as queue
def find_compilation_database(path):
"""Adjusts the directory until a compilation database is found."""
result = './'
while not os.path.isfile(os.path.join(result, path)):
if os.path.realpath(result) == '/':
print('Error: could not find compilation database.')
sys.exit(1)
result += '../'
return os.path.realpath(result)
def make_absolute(f, directory):
if os.path.isabs(f):
return f
return os.path.normpath(os.path.join(directory, f))
def get_tidy_invocation(f, clang_tidy_binary, checks, tmpdir, build_path,
header_filter, extra_arg, extra_arg_before, quiet):
"""Gets a command line for clang-tidy."""
start = [clang_tidy_binary]
if header_filter is not None:
start.append('-header-filter=' + header_filter)
else:
# Show warnings in all in-project headers by default.
start.append('-header-filter=^' + build_path + '/.*')
if checks:
start.append('-checks=' + checks)
if tmpdir is not None:
start.append('-export-fixes')
# Get a temporary file. We immediately close the handle so clang-tidy can
# overwrite it.
(handle, name) = tempfile.mkstemp(suffix='.yaml', dir=tmpdir)
os.close(handle)
start.append(name)
for arg in extra_arg:
start.append('-extra-arg=%s' % arg)
for arg in extra_arg_before:
start.append('-extra-arg-before=%s' % arg)
start.append('-p=' + build_path)
if quiet:
start.append('-quiet')
start.append(f)
return start
def merge_replacement_files(tmpdir, mergefile):
"""Merge all replacement files in a directory into a single file"""
# The fixes suggested by clang-tidy >= 4.0.0 are given under
# the top level key 'Diagnostics' in the output yaml files
mergekey="Diagnostics"
merged=[]
for replacefile in glob.iglob(os.path.join(tmpdir, '*.yaml')):
content = yaml.safe_load(open(replacefile, 'r'))
if not content:
continue # Skip empty files.
merged.extend(content.get(mergekey, []))
if merged:
# MainSourceFile: The key is required by the definition inside
# include/clang/Tooling/ReplacementsYaml.h, but the value
# is actually never used inside clang-apply-replacements,
# so we set it to '' here.
output = { 'MainSourceFile': '', mergekey: merged }
with open(mergefile, 'w') as out:
yaml.safe_dump(output, out)
else:
# Empty the file:
open(mergefile, 'w').close()
def check_clang_apply_replacements_binary(args):
"""Checks if invoking supplied clang-apply-replacements binary works."""
try:
subprocess.check_call([args.clang_apply_replacements_binary, '--version'])
except:
print('Unable to run clang-apply-replacements. Is clang-apply-replacements '
'binary correctly specified?', file=sys.stderr)
traceback.print_exc()
sys.exit(1)
def apply_fixes(args, tmpdir):
"""Calls clang-apply-fixes on a given directory."""
invocation = [args.clang_apply_replacements_binary]
if args.format:
invocation.append('-format')
if args.style:
invocation.append('-style=' + args.style)
invocation.append(tmpdir)
subprocess.call(invocation)
def run_tidy(args, tmpdir, build_path, queue):
"""Takes filenames out of queue and runs clang-tidy on them."""
while True:
name = queue.get()
invocation = get_tidy_invocation(name, args.clang_tidy_binary, args.checks,
tmpdir, build_path, args.header_filter,
args.extra_arg, args.extra_arg_before,
args.quiet)
sys.stdout.write(' '.join(invocation) + '\n')
subprocess.call(invocation)
queue.task_done()
def main():
parser = argparse.ArgumentParser(description='Runs clang-tidy over all files '
'in a compilation database. Requires '
'clang-tidy and clang-apply-replacements in '
'$PATH.')
parser.add_argument('-clang-tidy-binary', metavar='PATH',
default='clang-tidy-6.0',
help='path to clang-tidy binary')
parser.add_argument('-clang-apply-replacements-binary', metavar='PATH',
default='clang-apply-replacements-6.0',
help='path to clang-apply-replacements binary')
parser.add_argument('-checks', default=None,
help='checks filter, when not specified, use clang-tidy '
'default')
parser.add_argument('-header-filter', default=None,
help='regular expression matching the names of the '
'headers to output diagnostics from. Diagnostics from '
'the main file of each translation unit are always '
'displayed.')
parser.add_argument('-export-fixes', metavar='filename', dest='export_fixes',
help='Create a yaml file to store suggested fixes in, '
'which can be applied with clang-apply-replacements.')
parser.add_argument('-j', type=int, default=0,
help='number of tidy instances to be run in parallel.')
parser.add_argument('files', nargs='*', default=['.*'],
help='files to be processed (regex on path)')
parser.add_argument('-fix', action='store_true', help='apply fix-its')
parser.add_argument('-format', action='store_true', help='Reformat code '
'after applying fixes')
parser.add_argument('-style', default='file', help='The style of reformat '
'code after applying fixes')
parser.add_argument('-p', dest='build_path',
help='Path used to read a compile command database.')
parser.add_argument('-extra-arg', dest='extra_arg',
action='append', default=[],
help='Additional argument to append to the compiler '
'command line.')
parser.add_argument('-extra-arg-before', dest='extra_arg_before',
action='append', default=[],
help='Additional argument to prepend to the compiler '
'command line.')
parser.add_argument('-quiet', action='store_true',
help='Run clang-tidy in quiet mode')
args = parser.parse_args()
db_path = 'compile_commands.json'
if args.build_path is not None:
build_path = args.build_path
else:
# Find our database
build_path = find_compilation_database(db_path)
try:
invocation = [args.clang_tidy_binary, '-list-checks']
invocation.append('-p=' + build_path)
if args.checks:
invocation.append('-checks=' + args.checks)
invocation.append('-')
subprocess.check_call(invocation)
except:
print("Unable to run clang-tidy.", file=sys.stderr)
sys.exit(1)
# Load the database and extract all files.
database = json.load(open(os.path.join(build_path, db_path)))
files = [make_absolute(entry['file'], entry['directory'])
for entry in database]
max_task = args.j
if max_task == 0:
max_task = multiprocessing.cpu_count()
tmpdir = None
if args.fix or args.export_fixes:
check_clang_apply_replacements_binary(args)
tmpdir = tempfile.mkdtemp()
# Build up a big regexy filter from all command line arguments.
file_name_re = re.compile('|'.join(args.files))
try:
# Spin up a bunch of tidy-launching threads.
task_queue = queue.Queue(max_task)
for _ in range(max_task):
t = threading.Thread(target=run_tidy,
args=(args, tmpdir, build_path, task_queue))
t.daemon = True
t.start()
# Fill the queue with files.
for name in files:
if file_name_re.search(name):
task_queue.put(name)
# Wait for all threads to be done.
task_queue.join()
except KeyboardInterrupt:
# This is a sad hack. Unfortunately subprocess goes
# bonkers with ctrl-c and we start forking merrily.
print('\nCtrl-C detected, goodbye.')
if tmpdir:
shutil.rmtree(tmpdir)
os.kill(0, 9)
return_code = 0
if args.export_fixes:
print('Writing fixes to ' + args.export_fixes + ' ...')
try:
merge_replacement_files(tmpdir, args.export_fixes)
except:
print('Error exporting fixes.\n', file=sys.stderr)
traceback.print_exc()
return_code=1
if args.fix:
print('Applying fixes ...')
try:
apply_fixes(args, tmpdir)
except:
print('Error applying fixes.\n', file=sys.stderr)
traceback.print_exc()
return_code=1
if tmpdir:
shutil.rmtree(tmpdir)
sys.exit(return_code)
if __name__ == '__main__':
main()

View File

@@ -0,0 +1,22 @@
#! /bin/bash
sed -i "s/QCLOUD_ERR_SUCCESS/QCLOUD_RET_SUCCESS/g" `grep -rwl QCLOUD_ERR_SUCCESS ./*`
sed -i "s/QCLOUD_ERR_MQTT_RECONNECTED/QCLOUD_RET_MQTT_RECONNECTED/g" `grep -rwl QCLOUD_ERR_MQTT_RECONNECTED ./*`
sed -i "s/QCLOUD_ERR_MQTT_MANUALLY_DISCONNECTED/QCLOUD_RET_MQTT_MANUALLY_DISCONNECTED/g" `grep -rwl QCLOUD_ERR_MQTT_MANUALLY_DISCONNECTED ./*`
sed -i "s/QCLOUD_ERR_MQTT_CONNACK_CONNECTION_ACCEPTED/QCLOUD_RET_MQTT_CONNACK_CONNECTION_ACCEPTED/g" `grep -rwl QCLOUD_ERR_MQTT_CONNACK_CONNECTION_ACCEPTED ./*`
sed -i "s/QCLOUD_ERR_MQTT_ALREADY_CONNECTED/QCLOUD_RET_MQTT_ALREADY_CONNECTED/g" `grep -rwl QCLOUD_ERR_MQTT_ALREADY_CONNECTED ./*`
sed -i "s/MAX_SIZE_OF_DEVICE_SERC/MAX_SIZE_OF_DEVICE_SECRET/g" `grep -rwl MAX_SIZE_OF_DEVICE_SERC ./*`
sed -i "s/devCertFileName/dev_cert_file_name/g" `grep -rwl devCertFileName ./*`
sed -i "s/devPrivateKeyFileName/dev_key_file_name/g" `grep -rwl devPrivateKeyFileName ./*`
sed -i "s/devSerc/device_secret/g" `grep -rwl devSerc ./*`
sed -i "s/MAX_SIZE_OF_PRODUCT_KEY/MAX_SIZE_OF_PRODUCT_SECRET/g" `grep -rwl MAX_SIZE_OF_PRODUCT_KEY ./*`
sed -i "s/product_key/product_secret/g" `grep -rwl product_key ./*`
sed -i "s/DEBUG/eLOG_DEBUG/g" `grep -rwl DEBUG ./*`
sed -i "s/INFO/eLOG_INFO/g" `grep -rwl INFO ./*`
sed -i "s/WARN/eLOG_WARN/g" `grep -rwl WARN ./*`
sed -i "s/ERROR/eLOG_ERROR/g" `grep -rwl ERROR ./*`
sed -i "s/DISABLE/eLOG_DISABLE/g" `grep -rwl DISABLE ./*`
sed -i "s/Log_writter/IOT_Log_Gen/g" `grep -rwl Log_writter ./*`
sed -i "s/qcloud_iot_dyn_reg_dev/IOT_DynReg_Device/g" `grep -rwl qcloud_iot_dyn_reg_dev ./*`
sed -i "s/IOT_SYSTEM_GET_TIME/IOT_Get_SysTime/g" `grep -rwl IOT_SYSTEM_GET_TIME ./*`