diff --git a/docs/changes.md b/docs/changes.md index 97e8a21b0..fcec075fb 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -1,6 +1,7 @@ # 最新动态 2020/12/10 + * 完善fscript,增加函数seq。 * 增加函数fs\_file\_read\_line。 * 优化融合算法针对目标位图为非 cache 的情况(感谢智明提供补丁) * 修改窗口设置字体管理器和图片管理器不正常的问题(感谢智明提供补丁) diff --git a/docs/fscript.md b/docs/fscript.md index f92cd990d..18acb92d4 100644 --- a/docs/fscript.md +++ b/docs/fscript.md @@ -196,6 +196,35 @@ print(join(",", a, b)) noop() ``` +#### seq + +> 把组合多条语句组合成一条语句。方便在if语句中执行多条语句。 +---------------------------- + +##### 原型 + +``` +seq(s1, s2, s3, ...) +``` + +示例 + +```js +if( + msg.topic == "eof", + seq( + print(msg.topic), + set(aborted, true), + #("文件读取完毕,关闭定时器"), + set(flow.timer.enable, false) + ), + seq( + print(str(msg.payload, true)), + set(msg.payload, toupper(str(msg.payload, true))) + ) +) +``` + #### if > 条件执行。如果第一个参数为 true,执行第二个参数,否则执行第三个参数。 @@ -442,13 +471,16 @@ float("123") ##### 原型 ``` -str(var) +str(var [,force_pointer_as_str]) ``` +> force\_pointer\_as\_str 如果输入参数是POINTER类型,是否将强制转换成字符串。 + #### 示例 ``` str(int(123)) +str(msg.payload, true) ``` #### iformat diff --git a/src/tkc/fscript.c b/src/tkc/fscript.c index f90605f94..d5ae83925 100644 --- a/src/tkc/fscript.c +++ b/src/tkc/fscript.c @@ -1073,9 +1073,22 @@ static ret_t func_float(fscript_t* fscript, fscript_args_t* args, value_t* resul static ret_t func_str(fscript_t* fscript, fscript_args_t* args, value_t* result) { str_t* str = &(fscript->str); - return_value_if_fail(args->size == 1, RET_BAD_PARAMS); - str_from_value(str, args->args); - value_set_str(result, str->str); + return_value_if_fail(args->size >= 1, RET_BAD_PARAMS); + + if(args->args->type == VALUE_TYPE_POINTER) { + bool_t force_pointer_as_str = args->size == 2 && value_bool(args->args+1); + if(force_pointer_as_str) { + value_set_str(result, (const char*)value_pointer(args->args)); + } else { + char buff[16]; + tk_snprintf(buff, sizeof(buff)-1, "%p", value_pointer(args->args)); + str_set(str, buff); + value_set_str(result, str->str); + } + } else { + str_from_value(str, args->args); + value_set_str(result, str->str); + } return RET_OK; } @@ -1668,6 +1681,7 @@ static const func_entry_t s_builtin_funcs[] = { {"mul", func_mul, 2}, {"#", func_noop, 0}, {"noop", func_noop, 0}, + {"seq", func_noop, 4}, {"not", func_not, 1}, {"or", func_or, 2}, {"random", func_random, 2}, diff --git a/src/tkc/fscript.h b/src/tkc/fscript.h index dae197c5a..27ec22816 100644 --- a/src/tkc/fscript.h +++ b/src/tkc/fscript.h @@ -22,7 +22,7 @@ BEGIN_C_DECLS -#define FSCRIPT_MAX_ARGS 8 +#define FSCRIPT_MAX_ARGS 32 /** * @class fscript_args_t