From 48ce8c4e167359a4cb3087e752c1ce844b33aa84 Mon Sep 17 00:00:00 2001 From: Iampete1 Date: Fri, 14 Oct 2022 17:57:32 +0100 Subject: [PATCH] AP_Scripting: binding gen: add number of argument to manual functions and generate docs for manual --- .../generator/description/bindings.desc | 24 +++---- libraries/AP_Scripting/generator/src/main.c | 65 +++++++++++++++++-- 2 files changed, 73 insertions(+), 16 deletions(-) diff --git a/libraries/AP_Scripting/generator/description/bindings.desc b/libraries/AP_Scripting/generator/description/bindings.desc index 72ef272de7..46449c651b 100644 --- a/libraries/AP_Scripting/generator/description/bindings.desc +++ b/libraries/AP_Scripting/generator/description/bindings.desc @@ -347,7 +347,7 @@ singleton AP_Param method add_table boolean uint8_t 0 200 string uint8_t 1 63 singleton AP_Param method add_param boolean uint8_t 0 200 uint8_t 1 63 string float'skip_check include AP_Scripting/AP_Scripting_helpers.h -userdata Parameter creation lua_new_Parameter +userdata Parameter creation lua_new_Parameter 1 userdata Parameter method init boolean string userdata Parameter method init_by_info boolean uint16_t 0 UINT16_MAX uint32_t'skip_check ap_var_type'enum AP_PARAM_INT8 AP_PARAM_FLOAT userdata Parameter method get boolean float'Null @@ -438,7 +438,7 @@ include AP_HAL/I2CDevice.h ap_object AP_HAL::I2CDevice semaphore-pointer ap_object AP_HAL::I2CDevice method set_retries void uint8_t 0 20 ap_object AP_HAL::I2CDevice method write_register boolean uint8_t 0 UINT8_MAX uint8_t 0 UINT8_MAX -ap_object AP_HAL::I2CDevice manual read_registers AP_HAL__I2CDevice_read_registers +ap_object AP_HAL::I2CDevice manual read_registers AP_HAL__I2CDevice_read_registers 2 ap_object AP_HAL::I2CDevice method set_address void uint8_t 0 UINT8_MAX @@ -481,8 +481,8 @@ include AP_InertialSensor/AP_InertialSensor.h singleton AP_InertialSensor rename ins singleton AP_InertialSensor method get_temperature float uint8_t 0 INS_MAX_INSTANCES -singleton CAN manual get_device lua_get_CAN_device -singleton CAN manual get_device2 lua_get_CAN_device2 +singleton CAN manual get_device lua_get_CAN_device 1 +singleton CAN manual get_device2 lua_get_CAN_device2 1 singleton CAN depends HAL_MAX_CAN_PROTOCOL_DRIVERS include AP_Scripting/AP_Scripting_CANSensor.h depends HAL_MAX_CAN_PROTOCOL_DRIVERS @@ -606,15 +606,15 @@ singleton AP_EFI method get_backend AP_EFI_Backend uint8_t 0 UINT8_MAX -- ----END EFI Library---- singleton AP_Logger rename logger -singleton AP_Logger manual write AP_Logger_Write +singleton AP_Logger manual write AP_Logger_Write 7 -singleton i2c manual get_device lua_get_i2c_device +singleton i2c manual get_device lua_get_i2c_device 4 -global manual millis lua_millis -global manual micros lua_micros -global manual mission_receive lua_mission_receive +global manual millis lua_millis 0 +global manual micros lua_micros 0 +global manual mission_receive lua_mission_receive 0 -userdata uint32_t creation lua_new_uint32_t +userdata uint32_t creation lua_new_uint32_t 1 userdata uint32_t manual_operator __add uint32_t___add userdata uint32_t manual_operator __sub uint32_t___sub userdata uint32_t manual_operator __mul uint32_t___mul @@ -631,6 +631,6 @@ userdata uint32_t manual_operator __lt uint32_t___lt userdata uint32_t manual_operator __le uint32_t___le userdata uint32_t manual_operator __bnot uint32_t___bnot userdata uint32_t manual_operator __tostring uint32_t___tostring -userdata uint32_t manual toint uint32_t_toint -userdata uint32_t manual tofloat uint32_t_tofloat +userdata uint32_t manual toint uint32_t_toint 0 +userdata uint32_t manual tofloat uint32_t_tofloat 0 diff --git a/libraries/AP_Scripting/generator/src/main.c b/libraries/AP_Scripting/generator/src/main.c index dff0f6ac8b..d6747ad47c 100644 --- a/libraries/AP_Scripting/generator/src/main.c +++ b/libraries/AP_Scripting/generator/src/main.c @@ -365,6 +365,7 @@ struct method_alias { char *name; char *alias; int line; + int num_args; enum alias_type type; }; @@ -405,6 +406,7 @@ struct userdata { int flags; // flags from the userdata_flags enum char *dependency; char *creation; // name of a manual creation function if set, note that this will not be used internally + int creation_args; // number of args for custom creation function }; static struct userdata *parsed_userdata; @@ -856,13 +858,21 @@ void handle_manual(struct userdata *node, enum alias_type type) { } char *cpp_function_name = next_token(); if (cpp_function_name == NULL) { - error(ERROR_SINGLETON, "Expected a cpp name for manual %s method",node->name); + error(ERROR_SINGLETON, "Expected a cpp name for manual method %s %s", node->name, name); } struct method_alias *alias = allocate(sizeof(struct method_alias)); string_copy(&(alias->name), cpp_function_name); string_copy(&(alias->alias), name); alias->line = state.line_num; alias->type = type; + + if (type != ALIAS_TYPE_MANUAL_OPERATOR) { + char *num_args = next_token(); + if (num_args == NULL) { + error(ERROR_SINGLETON, "Expected number of args for manual method %s %s", node->name, name); + } + alias->num_args = atoi(num_args); + } alias->next = node->method_aliases; node->method_aliases = alias; } @@ -970,10 +980,16 @@ void handle_userdata(void) { if (node->creation != NULL) { error(ERROR_SINGLETON, "Userdata only support a single creation function"); } - char *creation = strtok(NULL, ""); + char *creation = next_token(); if (creation == NULL) { error(ERROR_USERDATA, "Expected a creation string for %s",node->name); } + char *num_args = next_token(); + if (num_args == NULL) { + error(ERROR_SINGLETON, "Expected number of args for creation method %s", node->name); + } + node->creation_args = atoi(num_args); + string_copy(&(node->creation), creation); } else if (strcmp(type, keyword_manual_operator) == 0) { @@ -2503,7 +2519,19 @@ void emit_docs(struct userdata *node, int is_userdata, int emit_creation) { if (emit_creation) { // creation function fprintf(docs, "---@return %s\n", name); - fprintf(docs, "function %s() end\n\n", node->rename ? node->rename : node->sanatized_name); + fprintf(docs, "function %s(", node->rename ? node->rename : node->sanatized_name); + if (node->creation == NULL) { + fprintf(docs, ") end\n\n"); + } else { + for (int i = 0; i < node->creation_args; ++i) { + fprintf(docs, "param%i", i+1); + if (i < node->creation_args-1) { + fprintf(docs, ", "); + } + } + fprintf(docs, ") end\n\n"); + } + } } else { // global @@ -2557,7 +2585,6 @@ void emit_docs(struct userdata *node, int is_userdata, int emit_creation) { // aliases struct method_alias *alias = node->method_aliases; while(alias) { - // dont do manual bindings if (alias->type == ALIAS_TYPE_NONE) { // find the method this is a alias of struct method * method = node->methods; @@ -2569,6 +2596,17 @@ void emit_docs(struct userdata *node, int is_userdata, int emit_creation) { } emit_docs_method(name, alias->alias, method); + + } else if (alias->type == ALIAS_TYPE_MANUAL) { + // Cant do a great job, don't know types or return + fprintf(docs, "-- desc\nfunction %s:%s(", name, alias->alias); + for (int i = 0; i < alias->num_args; ++i) { + fprintf(docs, "param%i", i+1); + if (i < alias->num_args-1) { + fprintf(docs, ", "); + } + } + fprintf(docs, ") end\n\n"); } alias = alias->next; } @@ -2797,6 +2835,25 @@ int main(int argc, char **argv) { emit_docs(parsed_singletons, FALSE, FALSE); + // global aliases + if (parsed_globals != NULL) { + struct method_alias *alias = parsed_globals->method_aliases; + while(alias) { + if (alias->type == ALIAS_TYPE_MANUAL) { + // Cant do a great job, don't know types or return + fprintf(docs, "-- desc\nfunction %s(", alias->alias); + for (int i = 0; i < alias->num_args; ++i) { + fprintf(docs, "param%i", i+1); + if (i < alias->num_args-1) { + fprintf(docs, ", "); + } + } + fprintf(docs, ") end\n\n"); + } + alias = alias->next; + } + } + fclose(docs); return 0;