From 4cd88a96d529014ff97bc245c509f2ede2f8858f Mon Sep 17 00:00:00 2001
From: Qiang <56512053+FromLiQg@users.noreply.github.com>
Date: Mon, 9 Jan 2023 21:05:30 +0800
Subject: [PATCH] Add more types and APIs for attr_container (#1841)
Add more types for attr_container, e.g. uint8, uint32, uint64
Add more APIs for attr_container for int8, int16 and int32 types
Rename fields of the union 'jvalue' and refactor some files that use attr_container
---
.../app-native-shared/attr_container.c | 194 ++++++++++++++----
.../app-native-shared/bi-inc/attr_container.h | 180 +++++++++++++++-
samples/gui/wasm-apps/increase/Makefile | 6 +-
.../wasm_django/devices/templates/help.html | 4 +-
.../wasm_django/server/wasm_server.py | 34 ++-
.../wasm_django/static/upload/connection.wasm | Bin 6379 -> 6280 bytes
.../static/upload/event_publisher.wasm | Bin 5074 -> 4958 bytes
.../static/upload/event_subscriber.wasm | Bin 3917 -> 4015 bytes
.../static/upload/request_handler.wasm | Bin 6702 -> 6776 bytes
.../static/upload/request_sender.wasm | Bin 5212 -> 5311 bytes
.../wasm_django/static/upload/sensor.wasm | Bin 4027 -> 4455 bytes
.../wasm_django/static/upload/simple | Bin 368240 -> 387456 bytes
.../static/upload/sys/connection.wasm | Bin 6379 -> 6280 bytes
.../static/upload/sys/event_publisher.wasm | Bin 5074 -> 4958 bytes
.../static/upload/sys/event_subscriber.wasm | Bin 3917 -> 4015 bytes
.../static/upload/sys/request_handler.wasm | Bin 6702 -> 6776 bytes
.../static/upload/sys/request_sender.wasm | Bin 5212 -> 5311 bytes
.../wasm_django/static/upload/sys/timer.wasm | Bin 2468 -> 2388 bytes
.../wasm_django/static/upload/timer.wasm | Bin 2468 -> 2388 bytes
.../wasm_django/static/upload/ui_app.wasm | Bin 1953 -> 1912 bytes
.../static/upload/vgl_wasm_runtime | Bin 512936 -> 0 bytes
.../static/upload/wasm_runtime_wgl | Bin 591680 -> 615016 bytes
test-tools/host-tool/src/host_tool_utils.c | 60 ++++--
23 files changed, 403 insertions(+), 75 deletions(-)
delete mode 100755 test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/vgl_wasm_runtime
diff --git a/core/app-framework/app-native-shared/attr_container.c b/core/app-framework/app-native-shared/attr_container.c
index e8c12019..e1e9f4e3 100644
--- a/core/app-framework/app-native-shared/attr_container.c
+++ b/core/app-framework/app-native-shared/attr_container.c
@@ -7,11 +7,14 @@
typedef union jvalue {
bool z;
- int8_t b;
- uint16_t c;
- int16_t s;
- int32_t i;
- int64_t j;
+ int8_t i8;
+ uint8_t u8;
+ int16_t i16;
+ uint16_t u16;
+ int32_t i32;
+ uint32_t u32;
+ int64_t i64;
+ uint64_t u64;
float f;
double d;
} jvalue;
@@ -27,7 +30,9 @@ get_int16(const char *buf)
static inline uint16_t
get_uint16(const char *buf)
{
- return get_int16(buf);
+ uint16_t ret;
+ bh_memcpy_s(&ret, sizeof(uint16_t), buf, sizeof(uint16_t));
+ return ret;
}
static inline int32_t
@@ -41,7 +46,9 @@ get_int32(const char *buf)
static inline uint32_t
get_uint32(const char *buf)
{
- return get_int32(buf);
+ uint32_t ret;
+ bh_memcpy_s(&ret, sizeof(uint32_t), buf, sizeof(uint32_t));
+ return ret;
}
static inline int64_t
@@ -55,7 +62,9 @@ get_int64(const char *buf)
static inline uint64_t
get_uint64(const char *buf)
{
- return get_int64(buf);
+ uint64_t ret;
+ bh_memcpy_s(&ret, sizeof(uint64_t), buf, sizeof(uint64_t));
+ return ret;
}
static inline void
@@ -145,8 +154,8 @@ attr_container_get_attr_next(const char *curr_attr)
p += sizeof(uint16_t) + get_uint16(p);
type = *p++;
- /* Short type to Boolean type */
- if (type >= ATTR_TYPE_SHORT && type <= ATTR_TYPE_BOOLEAN) {
+ /* Byte type to Boolean type */
+ if (type >= ATTR_TYPE_BYTE && type <= ATTR_TYPE_BOOLEAN) {
p += 1 << (type & 3);
return p;
}
@@ -342,7 +351,7 @@ attr_container_set_attr(attr_container_t **p_attr_cont, const char *key,
/* key len + key + '\0' + type */
attr_len = sizeof(uint16_t) + strlen(key) + 1 + 1;
- if (type >= ATTR_TYPE_SHORT && type <= ATTR_TYPE_BOOLEAN)
+ if (type >= ATTR_TYPE_BYTE && type <= ATTR_TYPE_BOOLEAN)
attr_len += 1 << (type & 3);
else if (type == ATTR_TYPE_STRING)
attr_len += sizeof(uint16_t) + value_length;
@@ -362,7 +371,7 @@ attr_container_set_attr(attr_container_t **p_attr_cont, const char *key,
p += str_len;
*p++ = type;
- if (type >= ATTR_TYPE_SHORT && type <= ATTR_TYPE_BOOLEAN)
+ if (type >= ATTR_TYPE_BYTE && type <= ATTR_TYPE_BOOLEAN)
bh_memcpy_s(p, 1 << (type & 3), value, 1 << (type & 3));
else if (type == ATTR_TYPE_STRING) {
set_uint16(p, value_length);
@@ -460,6 +469,14 @@ attr_container_set_short(attr_container_t **p_attr_cont, const char *key,
2);
}
+bool
+attr_container_set_int16(attr_container_t **p_attr_cont, const char *key,
+ int16_t value)
+{
+ return attr_container_set_attr(p_attr_cont, key, ATTR_TYPE_INT16, &value,
+ 2);
+}
+
bool
attr_container_set_int(attr_container_t **p_attr_cont, const char *key,
int value)
@@ -467,6 +484,22 @@ attr_container_set_int(attr_container_t **p_attr_cont, const char *key,
return attr_container_set_attr(p_attr_cont, key, ATTR_TYPE_INT, &value, 4);
}
+bool
+attr_container_set_int32(attr_container_t **p_attr_cont, const char *key,
+ int32_t value)
+{
+ return attr_container_set_attr(p_attr_cont, key, ATTR_TYPE_INT32, &value,
+ 4);
+}
+
+bool
+attr_container_set_uint32(attr_container_t **p_attr_cont, const char *key,
+ uint32_t value)
+{
+ return attr_container_set_attr(p_attr_cont, key, ATTR_TYPE_UINT32, &value,
+ 4);
+}
+
bool
attr_container_set_int64(attr_container_t **p_attr_cont, const char *key,
int64_t value)
@@ -475,6 +508,14 @@ attr_container_set_int64(attr_container_t **p_attr_cont, const char *key,
8);
}
+bool
+attr_container_set_uint64(attr_container_t **p_attr_cont, const char *key,
+ uint64_t value)
+{
+ return attr_container_set_attr(p_attr_cont, key, ATTR_TYPE_UINT64, &value,
+ 8);
+}
+
bool
attr_container_set_byte(attr_container_t **p_attr_cont, const char *key,
int8_t value)
@@ -482,6 +523,21 @@ attr_container_set_byte(attr_container_t **p_attr_cont, const char *key,
return attr_container_set_attr(p_attr_cont, key, ATTR_TYPE_BYTE, &value, 1);
}
+bool
+attr_container_set_int8(attr_container_t **p_attr_cont, const char *key,
+ int8_t value)
+{
+ return attr_container_set_attr(p_attr_cont, key, ATTR_TYPE_INT8, &value, 1);
+}
+
+bool
+attr_container_set_uint8(attr_container_t **p_attr_cont, const char *key,
+ uint8_t value)
+{
+ return attr_container_set_attr(p_attr_cont, key, ATTR_TYPE_UINT8, &value,
+ 1);
+}
+
bool
attr_container_set_uint16(attr_container_t **p_attr_cont, const char *key,
uint16_t value)
@@ -552,7 +608,7 @@ attr_container_get_attr(const attr_container_t *attr_cont, const char *key)
if (!(attr_addr = attr_container_find_attr(attr_cont, key))) {
attr_container_printf("Get attribute failed: lookup key failed.\r\n");
- return false;
+ return NULL;
}
/* key len + key + '\0' */
@@ -566,14 +622,17 @@ attr_container_get_attr(const attr_container_t *attr_cont, const char *key)
uint8_t type; \
if (!addr) \
return 0; \
- val.j = 0; \
+ val.i64 = 0; \
type = *(uint8_t *)addr++; \
switch (type) { \
- case ATTR_TYPE_SHORT: \
- case ATTR_TYPE_INT: \
+ case ATTR_TYPE_BYTE: /* = ATTR_TYPE_INT8 */ \
+ case ATTR_TYPE_SHORT: /* = ATTR_TYPE_INT16 */ \
+ case ATTR_TYPE_INT: /* = ATTR_TYPE_INT32 */ \
case ATTR_TYPE_INT64: \
- case ATTR_TYPE_BYTE: \
+ case ATTR_TYPE_UINT8: \
case ATTR_TYPE_UINT16: \
+ case ATTR_TYPE_UINT32: \
+ case ATTR_TYPE_UINT64: \
case ATTR_TYPE_FLOAT: \
case ATTR_TYPE_DOUBLE: \
case ATTR_TYPE_BOOLEAN: \
@@ -608,31 +667,67 @@ attr_container_get_attr(const attr_container_t *attr_cont, const char *key)
short
attr_container_get_as_short(const attr_container_t *attr_cont, const char *key)
{
- TEMPLATE_ATTR_BUF_TO_VALUE(attr_cont, key, s);
+ TEMPLATE_ATTR_BUF_TO_VALUE(attr_cont, key, i16);
+}
+
+int16_t
+attr_container_get_as_int16(const attr_container_t *attr_cont, const char *key)
+{
+ return (int16_t)attr_container_get_as_short(attr_cont, key);
}
int
attr_container_get_as_int(const attr_container_t *attr_cont, const char *key)
{
- TEMPLATE_ATTR_BUF_TO_VALUE(attr_cont, key, i);
+ TEMPLATE_ATTR_BUF_TO_VALUE(attr_cont, key, i32);
+}
+
+int32_t
+attr_container_get_as_int32(const attr_container_t *attr_cont, const char *key)
+{
+ return (int32_t)attr_container_get_as_int(attr_cont, key);
+}
+
+uint32_t
+attr_container_get_as_uint32(const attr_container_t *attr_cont, const char *key)
+{
+ return (uint32_t)attr_container_get_as_int(attr_cont, key);
}
int64_t
attr_container_get_as_int64(const attr_container_t *attr_cont, const char *key)
{
- TEMPLATE_ATTR_BUF_TO_VALUE(attr_cont, key, j);
+ TEMPLATE_ATTR_BUF_TO_VALUE(attr_cont, key, i64);
+}
+
+uint64_t
+attr_container_get_as_uint64(const attr_container_t *attr_cont, const char *key)
+{
+ return (uint64_t)attr_container_get_as_int64(attr_cont, key);
}
int8_t
attr_container_get_as_byte(const attr_container_t *attr_cont, const char *key)
{
- TEMPLATE_ATTR_BUF_TO_VALUE(attr_cont, key, b);
+ TEMPLATE_ATTR_BUF_TO_VALUE(attr_cont, key, i8);
+}
+
+int8_t
+attr_container_get_as_int8(const attr_container_t *attr_cont, const char *key)
+{
+ return attr_container_get_as_byte(attr_cont, key);
+}
+
+uint8_t
+attr_container_get_as_uint8(const attr_container_t *attr_cont, const char *key)
+{
+ return (uint8_t)attr_container_get_as_byte(attr_cont, key);
}
uint16_t
attr_container_get_as_uint16(const attr_container_t *attr_cont, const char *key)
{
- TEMPLATE_ATTR_BUF_TO_VALUE(attr_cont, key, s);
+ return (uint16_t)attr_container_get_as_short(attr_cont, key);
}
float
@@ -671,11 +766,14 @@ attr_container_get_as_bytearray(const attr_container_t *attr_cont,
type = *(uint8_t *)addr++;
switch (type) {
- case ATTR_TYPE_SHORT:
- case ATTR_TYPE_INT:
+ case ATTR_TYPE_BYTE: /* = ATTR_TYPE_INT8 */
+ case ATTR_TYPE_SHORT: /* = ATTR_TYPE_INT16 */
+ case ATTR_TYPE_INT: /* = ATTR_TYPE_INT32 */
case ATTR_TYPE_INT64:
- case ATTR_TYPE_BYTE:
+ case ATTR_TYPE_UINT8:
case ATTR_TYPE_UINT16:
+ case ATTR_TYPE_UINT32:
+ case ATTR_TYPE_UINT64:
case ATTR_TYPE_FLOAT:
case ATTR_TYPE_DOUBLE:
case ATTR_TYPE_BOOLEAN:
@@ -807,34 +905,52 @@ attr_container_dump(const attr_container_t *attr_cont)
attr_container_printf(" key: %s", key);
switch (type) {
- case ATTR_TYPE_SHORT:
- bh_memcpy_s(&value.s, sizeof(int16_t), p, sizeof(int16_t));
+ case ATTR_TYPE_BYTE: /* = ATTR_TYPE_INT8 */
+ bh_memcpy_s(&value.i8, 1, p, 1);
+ attr_container_printf(", type: byte, value: 0x%x\n",
+ value.i8 & 0xFF);
+ p++;
+ break;
+ case ATTR_TYPE_SHORT: /* = ATTR_TYPE_INT16 */
+ bh_memcpy_s(&value.i16, sizeof(int16_t), p, sizeof(int16_t));
attr_container_printf(", type: short, value: 0x%x\n",
- value.s & 0xFFFF);
+ value.i16 & 0xFFFF);
p += 2;
break;
- case ATTR_TYPE_INT:
- bh_memcpy_s(&value.i, sizeof(int32_t), p, sizeof(int32_t));
- attr_container_printf(", type: int, value: 0x%x\n", value.i);
+ case ATTR_TYPE_INT: /* = ATTR_TYPE_INT32 */
+ bh_memcpy_s(&value.i32, sizeof(int32_t), p, sizeof(int32_t));
+ attr_container_printf(", type: int, value: 0x%x\n", value.i32);
p += 4;
break;
case ATTR_TYPE_INT64:
- bh_memcpy_s(&value.j, sizeof(uint64_t), p, sizeof(uint64_t));
+ bh_memcpy_s(&value.i64, sizeof(int64_t), p, sizeof(int64_t));
attr_container_printf(", type: int64, value: 0x%llx\n",
- (long long unsigned int)(value.j));
+ (long long unsigned int)(value.i64));
p += 8;
break;
- case ATTR_TYPE_BYTE:
- bh_memcpy_s(&value.b, 1, p, 1);
- attr_container_printf(", type: byte, value: 0x%x\n",
- value.b & 0xFF);
+ case ATTR_TYPE_UINT8:
+ bh_memcpy_s(&value.u8, 1, p, 1);
+ attr_container_printf(", type: uint8, value: 0x%x\n", value.u8);
p++;
break;
case ATTR_TYPE_UINT16:
- bh_memcpy_s(&value.c, sizeof(uint16_t), p, sizeof(uint16_t));
- attr_container_printf(", type: uint16, value: 0x%x\n", value.c);
+ bh_memcpy_s(&value.u16, sizeof(uint16_t), p, sizeof(uint16_t));
+ attr_container_printf(", type: uint16, value: 0x%x\n",
+ value.u16);
p += 2;
break;
+ case ATTR_TYPE_UINT32:
+ bh_memcpy_s(&value.u32, sizeof(uint32_t), p, sizeof(uint32_t));
+ attr_container_printf(", type: uint32, value: 0x%x\n",
+ value.u32);
+ p += 4;
+ break;
+ case ATTR_TYPE_UINT64:
+ bh_memcpy_s(&value.u64, sizeof(uint64_t), p, sizeof(uint64_t));
+ attr_container_printf(", type: int64, value: 0x%llx\n",
+ (long long unsigned int)(value.u64));
+ p += 8;
+ break;
case ATTR_TYPE_FLOAT:
bh_memcpy_s(&value.f, sizeof(float), p, sizeof(float));
attr_container_printf(", type: float, value: %f\n", value.f);
diff --git a/core/app-framework/app-native-shared/bi-inc/attr_container.h b/core/app-framework/app-native-shared/bi-inc/attr_container.h
index 3b7be806..f5d8759b 100644
--- a/core/app-framework/app-native-shared/bi-inc/attr_container.h
+++ b/core/app-framework/app-native-shared/bi-inc/attr_container.h
@@ -20,13 +20,27 @@ extern "C" {
/* Attribute type */
enum {
- ATTR_TYPE_BEGIN = 1,
- ATTR_TYPE_SHORT = ATTR_TYPE_BEGIN,
+ ATTR_TYPE_BEGIN = 0,
+ ATTR_TYPE_BYTE = ATTR_TYPE_BEGIN,
+ ATTR_TYPE_INT8 = ATTR_TYPE_BYTE,
+ ATTR_TYPE_SHORT,
+ ATTR_TYPE_INT16 = ATTR_TYPE_SHORT,
ATTR_TYPE_INT,
+ ATTR_TYPE_INT32 = ATTR_TYPE_INT,
ATTR_TYPE_INT64,
- ATTR_TYPE_BYTE,
+ ATTR_TYPE_UINT8,
ATTR_TYPE_UINT16,
- ATTR_TYPE_FLOAT,
+ ATTR_TYPE_UINT32,
+ ATTR_TYPE_UINT64,
+ /**
+ * Why ATTR_TYPE_FLOAT = 10?
+ * We determine the number of bytes that should be copied through 1<<(type &
+ * 3). ATTR_TYPE_BYTE = 0, so the number of bytes is 1 << 0 = 1.
+ * ATTR_TYPE_UINT64 = 7, so the number of bytes is 1 << 3 = 8.
+ * Since the float type takes up 4 bytes, ATTR_TYPE_FLOAT should be 10.
+ * Calculation: (1 << (10&3)) = (1 << 2) = 4
+ */
+ ATTR_TYPE_FLOAT = 10,
ATTR_TYPE_DOUBLE,
ATTR_TYPE_BOOLEAN,
ATTR_TYPE_STRING,
@@ -89,6 +103,20 @@ bool
attr_container_set_short(attr_container_t **p_attr_cont, const char *key,
short value);
+/**
+ * Set int16 attribute in attribute container
+ *
+ * @param p_attr_cont pointer to attribute container to set attribute, and
+ * return the new attribute container if it is re-created
+ * @param key the attribute key
+ * @param value the attribute value
+ *
+ * @return true if success, false otherwise
+ */
+bool
+attr_container_set_int16(attr_container_t **p_attr_cont, const char *key,
+ int16_t value);
+
/**
* Set int attribute in attribute container
*
@@ -103,6 +131,34 @@ bool
attr_container_set_int(attr_container_t **p_attr_cont, const char *key,
int value);
+/**
+ * Set int32 attribute in attribute container
+ *
+ * @param p_attr_cont pointer to attribute container to set attribute, and
+ * return the new attribute container if it is re-created
+ * @param key the attribute key
+ * @param value the attribute value
+ *
+ * @return true if success, false otherwise
+ */
+bool
+attr_container_set_int32(attr_container_t **p_attr_cont, const char *key,
+ int32_t value);
+
+/**
+ * Set uint32 attribute in attribute container
+ *
+ * @param p_attr_cont pointer to attribute container to set attribute, and
+ * return the new attribute container if it is re-created
+ * @param key the attribute key
+ * @param value the attribute value
+ *
+ * @return true if success, false otherwise
+ */
+bool
+attr_container_set_uint32(attr_container_t **p_attr_cont, const char *key,
+ uint32_t value);
+
/**
* Set int64 attribute in attribute container
*
@@ -117,6 +173,20 @@ bool
attr_container_set_int64(attr_container_t **p_attr_cont, const char *key,
int64_t value);
+/**
+ * Set uint64 attribute in attribute container
+ *
+ * @param p_attr_cont pointer to attribute container to set attribute, and
+ * return the new attribute container if it is re-created
+ * @param key the attribute key
+ * @param value the attribute value
+ *
+ * @return true if success, false otherwise
+ */
+bool
+attr_container_set_uint64(attr_container_t **p_attr_cont, const char *key,
+ uint64_t value);
+
/**
* Set byte attribute in attribute container
*
@@ -131,6 +201,34 @@ bool
attr_container_set_byte(attr_container_t **p_attr_cont, const char *key,
int8_t value);
+/**
+ * Set int8 attribute in attribute container
+ *
+ * @param p_attr_cont pointer to attribute container to set attribute, and
+ * return the new attribute container if it is re-created
+ * @param key the attribute key
+ * @param value the attribute value
+ *
+ * @return true if success, false otherwise
+ */
+bool
+attr_container_set_int8(attr_container_t **p_attr_cont, const char *key,
+ int8_t value);
+
+/**
+ * Set uint8 attribute in attribute container
+ *
+ * @param p_attr_cont pointer to attribute container to set attribute, and
+ * return the new attribute container if it is re-created
+ * @param key the attribute key
+ * @param value the attribute value
+ *
+ * @return true if success, false otherwise
+ */
+bool
+attr_container_set_uint8(attr_container_t **p_attr_cont, const char *key,
+ uint8_t value);
+
/**
* Set uint16 attribute in attribute container
*
@@ -259,6 +357,18 @@ attr_container_contain_key(const attr_container_t *attr_cont, const char *key);
short
attr_container_get_as_short(const attr_container_t *attr_cont, const char *key);
+/**
+ * Get attribute from attribute container and return it as int16 value,
+ * return 0 if attribute isn't found in message.
+ *
+ * @param attr_cont the attribute container
+ * @param key the attribute key
+ *
+ * @return the short value of the attribute, 0 if key isn't found
+ */
+int16_t
+attr_container_get_as_int16(const attr_container_t *attr_cont, const char *key);
+
/**
* Get attribute from attribute container and return it as int value,
* return 0 if attribute isn't found in message.
@@ -271,6 +381,31 @@ attr_container_get_as_short(const attr_container_t *attr_cont, const char *key);
int
attr_container_get_as_int(const attr_container_t *attr_cont, const char *key);
+/**
+ * Get attribute from attribute container and return it as int32 value,
+ * return 0 if attribute isn't found in message.
+ *
+ * @param attr_cont the attribute container
+ * @param key the attribute key
+ *
+ * @return the int value of the attribute, 0 if key isn't found
+ */
+int32_t
+attr_container_get_as_int32(const attr_container_t *attr_cont, const char *key);
+
+/**
+ * Get attribute from attribute container and return it as uint32 value,
+ * return 0 if attribute isn't found in message.
+ *
+ * @param attr_cont the attribute container
+ * @param key the attribute key
+ *
+ * @return the unsigned int value of the attribute, 0 if key isn't found
+ */
+uint32_t
+attr_container_get_as_uint32(const attr_container_t *attr_cont,
+ const char *key);
+
/**
* Get attribute from attribute container and return it as int64 value,
* return 0 if attribute isn't found in attribute container.
@@ -283,6 +418,19 @@ attr_container_get_as_int(const attr_container_t *attr_cont, const char *key);
int64_t
attr_container_get_as_int64(const attr_container_t *attr_cont, const char *key);
+/**
+ * Get attribute from attribute container and return it as uint64 value,
+ * return 0 if attribute isn't found in attribute container.
+ *
+ * @param attr_cont the attribute container
+ * @param key the attribute key
+ *
+ * @return the unsigned long value of the attribute, 0 if key isn't found
+ */
+uint64_t
+attr_container_get_as_uint64(const attr_container_t *attr_cont,
+ const char *key);
+
/**
* Get attribute from attribute container and return it as byte value,
* return 0 if attribute isn't found in attribute container.
@@ -295,6 +443,30 @@ attr_container_get_as_int64(const attr_container_t *attr_cont, const char *key);
int8_t
attr_container_get_as_byte(const attr_container_t *attr_cont, const char *key);
+/**
+ * Get attribute from attribute container and return it as int8 value,
+ * return 0 if attribute isn't found in attribute container.
+ *
+ * @param attr_cont the attribute container
+ * @param key the attribute key
+ *
+ * @return the byte value of the attribute, 0 if key isn't found
+ */
+int8_t
+attr_container_get_as_int8(const attr_container_t *attr_cont, const char *key);
+
+/**
+ * Get attribute from attribute container and return it as uint8 value,
+ * return 0 if attribute isn't found in attribute container.
+ *
+ * @param attr_cont the attribute container
+ * @param key the attribute key
+ *
+ * @return the uint8 value of the attribute, 0 if key isn't found
+ */
+uint8_t
+attr_container_get_as_uint8(const attr_container_t *attr_cont, const char *key);
+
/**
* Get attribute from attribute container and return it as uint16 value,
* return 0 if attribute isn't found in attribute container.
diff --git a/samples/gui/wasm-apps/increase/Makefile b/samples/gui/wasm-apps/increase/Makefile
index 2c150332..5f250d6e 100644
--- a/samples/gui/wasm-apps/increase/Makefile
+++ b/samples/gui/wasm-apps/increase/Makefile
@@ -25,9 +25,9 @@ SRCS += $(APP_FRAMEWORK_DIR)/wgl/app/src/*.c
all:
@$(CC) $(CFLAGS) $(SRCS) \
- --target=wasm32 -O3 -z stack-size=2048 -Wl,--initial-memory=65536 \
- -Wl,--allow-undefined \
- -Wl,--strip-all,--no-entry -nostdlib \
+ --target=wasm32-wasi -O3 -z stack-size=2048 -Wl,--initial-memory=65536 \
+ -nostdlib -Wl,--allow-undefined \
+ -Wl,--strip-all,--no-entry \
-Wl,--export=on_init -Wl,--export=on_timer_callback \
-Wl,--export=on_widget_event \
-Wl,--export=__heap_base,--export=__data_end \
diff --git a/test-tools/IoT-APP-Store-Demo/wasm_django/devices/templates/help.html b/test-tools/IoT-APP-Store-Demo/wasm_django/devices/templates/help.html
index 9e9d63c9..4ad7427b 100755
--- a/test-tools/IoT-APP-Store-Demo/wasm_django/devices/templates/help.html
+++ b/test-tools/IoT-APP-Store-Demo/wasm_django/devices/templates/help.html
@@ -33,7 +33,7 @@
1. Download a simple runtime (build for ubuntu 20.04 64 bits, other platforms please build
- from the source code)
+ from the source code)
2. In the terminal: cd ~/Download && ./simple -a 82.156.57.236
@@ -44,7 +44,7 @@
Notes:
We also have a UI-enabled runtime, please download here and enjoy. It may require
+ href="../static/upload/wasm_runtime_wgl">download here and enjoy. It may require
a few more setups.
Before running the UI-enabled runtime, please install some required softwares:
sudo apt-get install libsdl2-2.0-0:i386
diff --git a/test-tools/IoT-APP-Store-Demo/wasm_django/server/wasm_server.py b/test-tools/IoT-APP-Store-Demo/wasm_django/server/wasm_server.py
index 5edeb90a..970ec6f6 100755
--- a/test-tools/IoT-APP-Store-Demo/wasm_django/server/wasm_server.py
+++ b/test-tools/IoT-APP-Store-Demo/wasm_django/server/wasm_server.py
@@ -16,14 +16,18 @@ import logging
import os
attr_type_list = [
- "ATTR_NONE",
- "ATTR_TYPE_SHORT",
- "ATTR_TYPE_INT",
+ "ATTR_TYPE_BYTE", # = ATTR_TYPE_INT8
+ "ATTR_TYPE_SHORT",# = ATTR_TYPE_INT16
+ "ATTR_TYPE_INT", # = ATTR_TYPE_INT32
"ATTR_TYPE_INT64",
- "ATTR_TYPE_BYTE",
+ "ATTR_TYPE_UINT8",
"ATTR_TYPE_UINT16",
+ "ATTR_TYPE_UINT32",
+ "ATTR_TYPE_UINT64",
"ATTR_TYPE_FLOAT",
"ATTR_TYPE_DOUBLE",
+ "ATTR_NONE",
+ "ATTR_NONE",
"ATTR_TYPE_BOOLEAN",
"ATTR_TYPE_STRING",
"ATTR_TYPE_BYTEARRAY"
@@ -140,26 +144,38 @@ def decode_attr_container(msg):
attr_type = attr_type_list[int(type_index[0])]
buf = buf[1 : ]
- if attr_type == "ATTR_TYPE_SHORT":
+ if attr_type == "ATTR_TYPE_BYTE": # = ATTR_TYPE_INT8
+ (attr_value, ) = struct.unpack('@c', buf[0 : 1])
+ buf = buf[1 : ]
+ # continue
+ elif attr_type == "ATTR_TYPE_SHORT": # = ATTR_TYPE_INT16
(attr_value, ) = struct.unpack('@h', buf[0 : 2])
buf = buf[2 : ]
# continue
- elif attr_type == "ATTR_TYPE_INT":
- (attr_value, ) = struct.unpack('@I', buf[0 : 4])
+ elif attr_type == "ATTR_TYPE_INT": # = ATTR_TYPE_INT32
+ (attr_value, ) = struct.unpack('@i', buf[0 : 4])
buf = buf[4 : ]
# continue
elif attr_type == "ATTR_TYPE_INT64":
(attr_value, ) = struct.unpack('@q', buf[0 : 8])
buf = buf[8 : ]
# continue
- elif attr_type == "ATTR_TYPE_BYTE":
- (attr_value, ) = struct.unpack('@c', buf[0 : 1])
+ elif attr_type == "ATTR_TYPE_UINT8":
+ (attr_value, ) = struct.unpack('@B', buf[0 : 1])
buf = buf[1 : ]
# continue
elif attr_type == "ATTR_TYPE_UINT16":
(attr_value, ) = struct.unpack('@H', buf[0 : 2])
buf = buf[2 : ]
# continue
+ elif attr_type == "ATTR_TYPE_UINT32":
+ (attr_value, ) = struct.unpack('@I', buf[0 : 4])
+ buf = buf[4 : ]
+ # continue
+ elif attr_type == "ATTR_TYPE_UINT64":
+ (attr_value, ) = struct.unpack('@Q', buf[0 : 8])
+ buf = buf[8 : ]
+ # continue
elif attr_type == "ATTR_TYPE_FLOAT":
(attr_value, ) = struct.unpack('@f', buf[0 : 4])
buf = buf[4 : ]
diff --git a/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/connection.wasm b/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/connection.wasm
index 2a2e79dc72c43d82914ca308f7bb1e90243a33be..936e80cf6191552616e15ce1906c350b25964bd6 100644
GIT binary patch
delta 1785
zcmZuxU2IfE6rP!T=kCwF+r6#OmO^0mN?{2pZAn}RD0a~DlP02xJ{XOW&}zKfw7^zh
zOzeW7t%aaDDnh~opf6|w$V+2<5Mzu)qdY*u1IA#C5AYzG_@FQNo!K_7NH)1UXXc#q
zedjx8=2rhy|G8^Q|J=QNpQP*RfxdSS)$1aDy^e2}6~)kaRu~n-u8Tz3AT@HM#Ey~n
zrbsK2HhD`XuV!U-(tb7rpORJsYQTuWf-s`2L=x~yx=)YbZF}@B=Vt=gR_z%q$k6B}
zNKSwhL0PCI!+`-{lWeaLiFT&Zsm-QI4hJet^3_(8*#Wm4TiWESCPTNq#Y;6J;F{#E
zm(J13!v(0=im1=;SXoP3l#m+u@WojvA2FFS3?BxTCXZMe^H<4;PWWB2Mzj8!XmSnTF2gFDEd3prNyk7oF;I6iP$94apn-uu$3PoDZBB^l?Jqni
z%Agq)g%5XA^kRra${oW$i!alSfS%)M@^R$IT3HP3w}g@
z6D1$*a>L@=8lA}=c(r+Q(FK{6(8i{0TUnPMOYG0K_J&({|mw3fmk>r>DAn(
z`!|bqo&X*uPRy;1tSBE6dKDF+EOp^>u0_gG`YFG({QLCX3>rZK2{-`dx^POu74k*e
z9uBoh`^{kl8M)Y98Tim_cxtE(t~NWtpI7$UJ9oT2;XStU@M<(RJTIj;X+_E7%J_20
ztvpkySS@mv7>FbsO$`)7Wz*HIynp7_?P{oio
z6d#=oTbxK%#^+qCuKZh<1+^E4vPN;WSfQTyZ4P9UD~))H_yi9~
zL4=qX8_(S;_n_!Thcr6GE0zf<-r*DpI_3iaw-0YrVeDH@9k0!Mpuucql^$+=$d=HRvii=I#IK|iL~JPt56UoO
zZ?J%Nl`w22i3=}KWEf%`T?izmFI%5bSEp!U+Xw3K6rF9mw)_u%!$EgHSI`xy&>m|V
zN?aLxd73`H@08j#-npx4aJ+kbtTtj^*!j}v$gtQpGCDeLx`)M+k325=
q*REUBhhINk=v+_KS)v0-bff(=oo`=HN7@rw)&3lHc9vHwL}+URXWIT8lxuqW=Mgq3Ac^VA0)o8
zTQOQ}37C_J5;TSoHN1$yC{YuG5MzvwJfNtFM18>D2Ve9-{myM~DJ4y}duGo0&Uemt
z&UCWpm!5N1mA>4u@(_Ke?yc1)>vdrc*YVlv#G=r8PFQ7N*F~hP>=hY{KkkNzD?+J0
zE4CEj;DXo+E6qd_7+Mwn8pvEt^`#z?-9)Dnko6y2&HArW=62k2|ME;N~tY
zxMn=|=oBi-Fplpsag^;AA_@}I1~I5aIb5hX$`9GhBk;6#AW-DUs||~jFEoZCD=sj63H
zYH?I>Svsa$%hRTok$wC+T>$U7n&3vKMXI-5K?DqP|Ym*X|%451w!ObHP}0CYPhtxn->
z{SlZ|Fbiw6JNIC-^(v}>-l&QS@CW?B*opI(awWNWZ$cT{c9h##ma5McW2&Lq1Cz!~T`LZDp*e>a*NgY-vS(0ce48cvRpW(y8!tzd>HtGLDa6
zeAJm|!rKn=@R$)dyey?xbE51qtXsStV<&iFd1vG{I#QTe!Br(`lT}w%SCrwLiW!=a
zT8mrOVq8EO49yuXwj$66wwIA8T
zOI!%4r?jc@x|F&GDw5|}G4t-NZFIQQM;A+7S)RA8MM=d)n`;;i9v+Mv!$||t>!K|z
zprHtdgQs5QP|9)=@gkO&XIL>C3T@vhK7!(-~}DLUWqs(OEl9$tKPYL}dtk!}G-4uh(
z?hvrtjcMAkR?1;NGO&c2z<-hc$aP=Vk%%^M3JL$dV)ilw(
zfsQnn=&z=ubfKw({%*XJ)-^TLmB#kQ15fYYwP(nVR!0t0$HwhbyY>!O2Wdmgsx{lI
z!^8V*`=IFFGrVuCD#WhA!O`m2nCMxze(l}(=@I+)jgE`QA9|DqS~}@OQ<(;u*8dNT
CnWC%!
diff --git a/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/event_publisher.wasm b/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/event_publisher.wasm
index 4cf911099ee9480c82a7469e939b8e524e4a31bf..31dc1018fee8b100fa7d9ddbfd0b40148a465fa7 100644
GIT binary patch
delta 1610
zcmZuxPiP!f7=Q20o7tIpv%AwxQtT$yH=|9qENyJT2nI2)n6?td_8^E9ajVlLZ)2M5
zZsKv1Y9uvQ#Lt$Zco4l5DpWiO^`t0*ry?l5=t(??fAHkZ_~_2?JRKL;4O&3EVXJnf-v#PW2JEA8$WNe!@t
zS7RbAP@#uoQ-7SX)Xh!pTI1U^z<{u6*zD@U)0h^J67Ro7f@160^PSET@X*vLtY(
zw2Mw`kcP&weXt=GA{KN-GnmIU#+Ext7;%*&2~FFU1miB^q?W?wG40mSkTwZI4CoNs
z!3}3Wk6_!W@-|fE!SsVW>GX8LCXo)cGTf$Wl7p289AP4OPiidsLOv2kG(i#tur2GF
zK%opAOAwY#1meQOh#Z?TZ8+)96y2r{o*<@C8W*m(_jL<8u&Fe^G8?bw>N$9}op>S#
z)zu!Bc+FJBujNTN#Zn6`nyK6KAzO$y=owXwGbRKLlI9oM0HM8jgKDuKVwSoGWe8c`
zSw{M4A5M9?hm7w)ChkNg6k_nO0V0!qWUiLC;c#&U`v7nhL2_wN*f_2yv$PBNpXB0p
z5=Zwz>M)LSw1$_J`F9K4!ajZx>V+@&^u?FC`0|$c5($p{>D}jOyLW6U@nDKD>)*?-
z!iIl(tb*f=-=WWHD_=Wx7uR(NgD1O0T7Es^cZsK1P>KJ1@SF(x<5i3f2Dnw{Kjnt={JKZ5%A4g1SMmLZjqqQ-W
zr8a7j(UO;rzYGGfEAa3UHMWd&jMxKImlCfZy3m>!4QXggCJg;wF4k
zuJP0GXL)}GS6`YD8($_lQhMs(P(1V;)oS|yIuRo??3h|XD(}y26E{=d4{@`$NoRkH
z5|KmHB(ml&@|hp=$U784U27srgn51Qvk&8l4`!>`Vuv*rvQ}sO>}uAU%NiYcVPF&v
z4vak2$zEQ{T8++1E7S9BO>sRpKRd@>X|xvS7iZbZ;!@+qrfy}+D_Ogv&ot&2vX}n%
kwwKN>wzIw)3Ik)1RX)PM-7r&0;rCquj8yi(C%c~i5Au3ffdBvi
delta 1701
zcmZWpU1%It6u$S)o!Qx$*<`YDFYnZko+D
z!54R9)kc$6?GdSBee_8sP(fb=1;KamMXY@gQIJAy&<7tx&za4}HhtJTd(J)gJKsIu
zIrr+wcLz2ODE;^F;7fS7y0_R`ZM8)Ba*Nh}Bf5RCi~tp$VMnY$jtd9qV}2J&N#NUR
zta;6q*`}IM6CfsY0wgb@phRq^W>JWo^v&w)x8hQ`OX*wH
z=zHR;JIiQ;lSDc2z&A39{c(ZEbkX8N>l*0LC;9;|$5}L225;!Q+zvk+vWF?+L3_IC
zRw4T+7nwA0K~-ZBzQ)RcNC-L`zLM$|Xu1P9kWFH3eicc$lB#FXJ#Xd}Sfno41ZG!b
zr+qe-#Ipl#wS8c9z|nDb7li^le3cOifbwYQu%d!&a{v|#GI+>=X39j}#6<37qI_mS
zS0W~Qn~Cn^rCj|W$Efur^+CcSYtSr-jI@;z6LFBqi(__
z|2D^$_^10=M3kI#D#CZTawVbLc3;QFa<+F=1mx8nR~I-YPhx~bq9s@b8mo|(-FPWG
zH2jT}R?~>cQWL}~f0+70@JMk}%R~5mc4d;vqT7?iQ=>qaR7iIOWd!}BZ^S*|e<-E;
zA1U04bk;jIoTBJ9iZEePQo%M*;Nzxu^p2mU)J=kx+(3$%j7<&Tll}z0B4WY9Z5A|g00>a)G$LoZ_#A$*k+Q)0bQ~HXM3J>S@t4nJ*pLk0M48h+JvQGK?CPj?q&70+~!(xXblrOjXxUgUzrTm%uN^abdG8Vt{+
zogu>a_-kY&e2Rx;ADJyGrhl4r-J2RFtj2Q7FU|Ee+7Hij6bVV)6C~y@_L+auoeR9<
z)65lA5GnKS`sE_^&4pdh;(fb%@VERP{3w4vewy#XJ^6F^Q_sl3nR2Z*-+&Wywd2s3
ztw5t*t}T{l8guhCak_S@JX3{wW%1N}ZLtC;%5x_x$MHzd2yXQB<|<2-T0<$SPs
Y^LW0ezq@?0Qg4jSFIDQZm2yM;2mWbl#sB~S
diff --git a/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/event_subscriber.wasm b/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/event_subscriber.wasm
index 1766c2565d407328b285cfa05294ce7196c6b66a..1dce622f416ba3c81f8ac96d89e613269e5946c2 100644
GIT binary patch
delta 1547
zcmZuxO>7%Q6rMM`8~^OCy^4T@ByGl~ZVXMZX^=xB1R2zZDisn!h!a(D%96%$e(E@(
z9FR>R!fhG|JU|7ZD!m~tNzXx*C5lKzk%AN-}}Dr
zeQ(A;?qBU*dj;I>KD)x?FRprS<7v1$eCNT|)eu;fN2>H;a+yyg;edYULxLT1nf&1*
zZFqXALx5m1TuAa9uX6eQCE5`ns~ku82w%U5pYbEk4#*E{jg1}rm8bDv?p9)P2HY^M
zmXPa)BT?INZN=5cSdI(%^I`)p3f_XU(LpLuNU#8vQK+n32vFH36jvxmbEOq(NL~$4
zb=Cx{ma9Fl{cZ
zU=^m_RY88en;A6O)9ylh?v~-cz2#<{w%4L@k1@7>#8?6OS3tPZ4Ag|y9-*@aa$%{_
z@ESgBc0XAMxxSlJbER(0(3O%Ga(t5#3KTZ6XeOO)kShVxHhy7to%kt~oVBk37!}D9hB}&bbR<0QD)!dnc*%O_uqm0aI!RV=0Xc38o}fkydl7*DUzv9t
zUut=^htP}+Qn5+J&TiFj0A_{uxDv_?7x2%PAv_d1)J@_bEK;Tl5N1IzrRTk;4sK`M
z#*?9=F?+1x6eLUYI(`>=wiRT(5nHFAHA;tJI(z`?_(Hh9vbEQls<@?)Nt14$FcX$B
zM3PpThXq&t(wixm_rB6oKUJ@egt)DCSkiKtZSx`NdFK@(X(<-#IXd(7MRzxNBL=#p
zv~N&SPmqA2VBWiGO)^C$=#qy6dipZehzOF??rYS=jDQvL~37zq%DV3ZMEbW`dQnkin14s_{6)xn{1H8$>jq=aaQ=P%&h
z=w<$S4HxaF`Ry9sv>)fy8vbqXhfQpEj=~n6bVidK7BE>2+jT2n^h@Q;^t@j>>huY?*X7Z;eM9H6>nVy>U#T)tYqW?O>n@(z9=FIe@
zpD7m3W{UaI%uMN2*`F7%Q6rMM`w%7Y(FQo+63CY+bZGad@0&Pe@)PvfjN-rD`Cj=y|Y2y6*r=k~}
zP*+VGSBm;lC=v?cfRMN}sH#99q#klYipYUmBh})Jgy0BB;mz3j5th9BX5Kg7``$Ni
z?{#f=ZoUoPM#iZ!`MIZ_8+ZY}9RB{PWB0-ksy@3&KPDS6m4zzs7L
zj#yFKQDj-h0xslw>wqZu*OZPVmEnaHbDOAMh3c0-v{3y=P^LmfHP_3G4H!B3>wa<8
zgiUBROW`by%P6)t5FIu!cR)*pGw8y!_@S{%Jhf
zq4k7x<^{$EjYW`KErvz>%FcWYluiwC>P=+@E
zH$$1M&&cgWS>0^8DE-UM7JyNeEM?FLfIN22BLJBu_h3Q72-@MLvk-8T=O`bd5fNON
z0ry>Ss00b~>7Am^3}+pHA2Rv>XZk7p&a0ZmY_c$tA8_}8$UPwX4Zy4tI~1rGS7Nfm
z?U;+?@S{j3LX#94_5gp5oav4`l6(+mK`33|*VH_eBh8@=FZVFh6>+(Qj
zPUwKwZV_0O2eo1j&RE@0!`s$N)klY|D2`QyOe@`nvcc@-mf$1g1x2P{{&iJWEd^QS
zN{BluLnl1uI6NnP|6_&F48nYa4RFHJr`3vxfi9HthBjIluP846s@juGktu=JKK;I+
zltF#aU1)Wbq|;c5o-}tkaQq_LllbSz$4q^y?o~I-xEt-`k5|yP`>J)-8aZH)UTQ0C
z$ZDxTe_;riQjhcPa`{xjzoWzui6YQv{I#Y$H3NEsu1`?XR}c4zC6y)hR8E@*WFA=u
zf{|~en-X+z`IIitn!OUeL6Ef4lBNUDg41x}mOTKg_^*9}e^q0Aj0>|S4-j5}5B;Jmn#uGRc
zOU7lnT$~)Ql=EVGvQ!?zKJS^f%Iy5ug(*?Ym*(eYOL_6Z*yMEnB1XKExZt(L#-{Vd
Sa(3==zBrK|E8{uux&HvpY)2CS
diff --git a/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/request_handler.wasm b/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/request_handler.wasm
index 1da74dbe705730c08ada54abc91630ef24993f03..85959790f665e373fcb998e8c554a47d09ab47d6 100644
GIT binary patch
delta 2559
zcmZuyYitx%6u$S)%B*O#0=NlWsrR+fn2S@JjE3g_rs^i9~v9$r^QI1y$>{_GqSH*abK)*Vb?
z^m3lh<#NROfKn|hNL*tboHP?6=z|f$sVG|m|FAudE(kYjlFZ?Z(FS->yB;^R4y<7`F_SaN2EJjx4)&TOaw(ax1ueDY4sneL
zu`Jdh9A}U8a1EKoSVfj<_zGYF|UbTCsp8-3nt6L?+`bi6sl^@u4GPNq%5@sbpdhZETgCN;C-$CuD2ZWIbh<`Fz`1M*Fx=M?3GPjMEL
zp&t)OIkADx2t~$=O3DO?HPA$u8y4G)LuhH!&T8h9Kq
zN*6y%1uz~c939Mum~~!&Qi&`VhspVI6SkM|0y0{JjNOimS%?AWERpFxGCYR2;K0*4
z1wb85{E<2#36v-Cq!#cg$3?y6SlS24!w!T?!|dwI5G`$>hhatOXS4mW>uT)!)Yx^T
zw$AB{{w4KVq)*9!h`=tVuKk#l{4HB3S}bjy3Q{9G2N})bX920CbJaWYqmICh5jgKu
zMsiI2dk|ePUyi{a&RTY51Xj*kW>2DFxUew^duKIe{WGB}IhT|Y$~4^w1S1g>#b-w>
z9Ebd7BpDYk_!+t9;LU-z5|
zhVim`dmL{+zvXebQdVnEP;t}8HUZ`3u6>D$^M1%B5aqRP-vpDaic_&~1c^_w3Vi)o
z3JbsJ;wSkHL4z~h6&1hb;b3`;UCF~c<;`xMc?AVoO+>seGsmG`rKhag|s
zResH+MC45Cs>yjz>X~-lkcQ@HBiyL01*>`vT%J9D;ZR?H*OneWm>L*Lr8E4=uI}E{
zRx)i(_wVRSr+hP{
zX(cUiq3Q&DR~3bGRW9tq|GTO-!pc}9l*W=U5vzeMv3hzhEQ-b8xmaE8Pp8q0e#j>*8l(j
delta 2511
zcmZWreQXp}5P$FO-re5qUc3FeUO&>lTUw~pa;267iqSr_pj3l@@Q;Z>Dje8tX-j(r
zNsM!})5k%O#
za=9EcFLSPC6-#KMU2;|YOcYg3jH&9kHX9r-UxrQ6K0)t&n<3*cLaXPz+Bd
z?AAIKFuazmK`{FOxlJ+MmrJK)17$HKz&)+D<|yZ4CbIotBfB_+Y_eMGd%
z-0tVk6|x_PD}g8LD2;^hV)H0NBass0V+f|$oFryKb+C?)g9pT
zncg4_DOO_P@Ps9@F=~#HD6y`V;)Nz@&?3rAQ?x7F-a!b@gVdL^#R9R)aPuehu+!6P
zURR{HgnaqURE(SvL8`Xreu_{+!#uEY9y?T`H9QuYD}EGk+$e?qP)Ypo9t>;mCg+uy
zDdkW3oP+m6kMbOR6>7>}pxm$o8WP6598G11T>O=qL>;JP$Xe
z20M+#)n2AF*64^h3;R9dfc}2i1K$}3`B~@-5A!$R*YG0o!3b1GstYAw#)32)>Nn=5
z7_5pUv%ecWob|oXAQCl?kK?@tjuRKfL{IHU-}&NE8!%{qhEZ%myt?_2)^iwWV8RKK
z!+;99PAJKkV|b!8Tx_`$mVt65Tqn{agR2o1Cc%&-LfEWYZ=eN2oru!hgyH#&AOr*B
zRo3+$ai|jsaEXvDnM5StSQNLp1%mN_Dai>Mc{*t{prE6G_cDS`A!j}k%({-HLU7Wo
zQ)S?!)o4udgYT^x
zMBK4DqehPmKTAc%9vJX^v^E=*Vb{^sE#~H*g@)P8j&5n#a14(Ry~hdKd#T3`M>ga_
ziXKPv@1*7;yRa`*(nR1hMk`(YLai1u;J+dChYWS;Qz^sp&NibK$ok5kPw+rcV>Y^)rhGPvX3BY`#mK#hppL;O;VvGR;stz)(hzX#~@x-Jx!bz^Q_I
zei*J7T#{2I^;@ocE!U@7uB&Zus<0yqZ{0tt6iJ1#T*Af;KyF?8LpqoVCh+ZGUY|c?
zf|HAk&5wgTke!2IG@Il-4zKghWJYuU?<_kk2L3^E9UIrv1XuU4QxtfDL)Km;4vxYV
zd#QDitDU%)NpTVEq6T=PD1-~fEr>8KG(8Xu8DShvbcKaV38_Z%XzALx9B^}C5S%h*
z`6!&`lxS8b@~GxnC>(NTg*{)bj4jsM)ffBVlcJKWK?=iD;6qA@7u00ld;+I%ItnLP
zXokx=^-mr)IUDAY33{;kjGbSq4XA@}`WgN;8|Tr%*T_pGYh-MxmgDNvJTM2>ifgSg
zuCC@U#^7FYwRMcE+xd%QkSKAiGhFQ&@qM3x)g{#}lfjgTV=dpIVy8qY9>G7_>JM7?
zcwtZH#MR$>;YdljxU&~ND`|2jx$C#nY+&ldD8iMusO@83rPb+C2$VL6TceOHZ4%?7
zu(q^HUh{C@(%1gT?+90xt8RGrKaIkn(nDfw3|hoGW5))hH#aHevG
zdDeg>vFg}x-$2*;9yypE8tCsEO3RI1-M#4zP#l{J$73O@>Pr|&48hE#&7Oq!RKx1VJ
zUazPGyRr(_RmR~`d@bCK7r}{m1#F5hf&O>_+$i6_NM$mE-LDL1(sF%&U#6?OFFhzX
z3~wH2V>6oG?x9Q@OAZhAF7&=Fa5Yv{j*%C#tzEst>4gl>E&jO$w#FJ^O>EBpj)Oap
diff --git a/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/request_sender.wasm b/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/request_sender.wasm
index f7c9b994eb481d62ae68eaa9a62ee2a1fec94b63..ce9a6f6e823ace66012f323be002476e5e2bbc47 100644
GIT binary patch
delta 2067
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
diff --git a/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/sensor.wasm b/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/sensor.wasm
index eb51ec8eea7c70fcbe738584c41635823e5b3ccf..f24bd10099e9ea1ec1e06a8fe1eed4a9e1e83db3 100644
GIT binary patch
delta 2089
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
KnJT9CBJ5w1ilH?C
diff --git a/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/simple b/test-tools/IoT-APP-Store-Demo/wasm_django/static/upload/simple
index da9c485ed4dd470df65977507b94beb7dea17dba..478a0f85f8674cde636b6f2f2d9d10b07f251560 100755
GIT binary patch
literal 387456
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