From 36f8b9a9cc1e82a2f333edf596dea3391bb49a40 Mon Sep 17 00:00:00 2001 From: Alden Hart Date: Sun, 19 Mar 2017 14:33:14 -0400 Subject: [PATCH] Checkpoint --- g2core/config.cpp | 12 +++++++++--- g2core/config.h | 29 ++++++++++++++++++++++------- g2core/config_app.cpp | 20 ++++++++++++-------- g2core/gcode.h | 2 +- g2core/json_parser.cpp | 27 +++++++++++++++++++++++---- g2core/report.h | 2 +- 6 files changed, 68 insertions(+), 24 deletions(-) diff --git a/g2core/config.cpp b/g2core/config.cpp index 123a6952..db429f53 100644 --- a/g2core/config.cpp +++ b/g2core/config.cpp @@ -131,7 +131,11 @@ static void _set_defa(nvObj_t *nv, bool print) if (cfgArray[nv->index].flags & F_ZERO) { nv->value = 0; } else { - nv->value = cfgArray[nv->index].def_value; + if (cfgArray[nv->index].flags & F_INT32) { + nv->value_int = cfgArray[nv->index].def_value; + } else { + nv->value = cfgArray[nv->index].def_value; + } } strncpy(nv->token, cfgArray[nv->index].token, TOKEN_LEN); cfgArray[nv->index].set(nv); // run the set method, nv_set(nv); @@ -222,7 +226,8 @@ stat_t get_int8(nvObj_t *nv) stat_t get_int32(nvObj_t *nv) { - nv->value = *((uint32_t *)GET_TABLE_WORD(target)); +//+++++ nv->value = *((uint32_t *)GET_TABLE_WORD(target)); + nv->value_int = *((uint32_t *)GET_TABLE_WORD(target)); nv->valuetype = TYPE_INT; return (STAT_OK); } @@ -331,7 +336,8 @@ stat_t set_0123(nvObj_t *nv) stat_t set_int32(nvObj_t *nv) { - *((uint32_t *)GET_TABLE_WORD(target)) = (uint32_t)nv->value; +// *((uint32_t *)GET_TABLE_WORD(target)) = (uint32_t)nv->value; +++++ + *((uint32_t *)GET_TABLE_WORD(target)) = nv->value_int; nv->valuetype = TYPE_INT; return(STAT_OK); } diff --git a/g2core/config.h b/g2core/config.h index fc305c11..c1ad4b29 100644 --- a/g2core/config.h +++ b/g2core/config.h @@ -208,7 +208,8 @@ typedef enum { // value typing for config and JSON TYPE_NULL = 0, // value is 'null' (meaning the JSON null value) TYPE_PARENT, // object is a parent to a sub-object TYPE_FLOAT, // value is a floating point number - TYPE_INT, // value is a signed or unsigned integer or any size + TYPE_INT, // value is a signed or unsigned integer < 32 bits + TYPE_INT32, // value is a 32 bit signed integer TYPE_STRING, // value is in string field TYPE_BOOL, // value is "true" (1) or "false"(0) TYPE_DATA, // value is blind cast to uint32_t @@ -223,6 +224,7 @@ typedef enum { // value typing for config and JSON #define F_CONVERT 0x08 // set if unit conversion is required #define F_ICONVERT 0x10 // set if unit conversion is required AND value is an inverse quantity #define F_ZERO 0x20 // initialize to zero (requires F_INITIALIZE set as well) +#define F_INT32 0x40 // treat as int32 #define _f0 0x00 #define _fi (F_INITIALIZE) @@ -238,6 +240,20 @@ typedef enum { // value typing for config and JSON #define _fipi (F_INITIALIZE | F_PERSIST | F_ICONVERT) #define _fipnc (F_INITIALIZE | F_PERSIST | F_NOSTRIP | F_CONVERT) +#define _i0 (F_INT32) +#define _ii (F_INT32) | (F_INITIALIZE) +#define _ip (F_INT32) | (F_PERSIST) +#define _in (F_INT32) | (F_NOSTRIP) +#define _ic (F_INT32) | (F_CONVERT) +#define _iic (F_INT32) | (F_INITIALIZE | F_CONVERT) +#define _iip (F_INT32) | (F_INITIALIZE | F_PERSIST) +#define _iiz (F_INT32) | (F_INITIALIZE | F_ZERO) +#define _iizc (F_INT32) | (F_INITIALIZE | F_ZERO | F_CONVERT) +#define _iipc (F_INT32) | (F_INITIALIZE | F_PERSIST | F_CONVERT) +#define _iipn (F_INT32) | (F_INITIALIZE | F_PERSIST | F_NOSTRIP) +#define _iipi (F_INT32) | (F_INITIALIZE | F_PERSIST | F_ICONVERT) +#define _iipnc (F_INT32) | (F_INITIALIZE | F_PERSIST | F_NOSTRIP | F_CONVERT) + /**** Structures ****/ typedef struct nvString { // shared string object @@ -258,10 +274,9 @@ typedef struct nvObject { // depending on use, not all elements ma int8_t depth; // depth of object in the tree. 0 is root (-1 is invalid) valueType valuetype; // see valueType enum int8_t precision; // decimal precision for reporting (JSON) -// float value; // numeric value union { float value; // float values - uint32_t value_int; // uint32 values + int32_t value_int; // int32 values }; char group[GROUP_LEN+1]; // group prefix or NUL if not in a group char token[TOKEN_LEN+1]; // full mnemonic token for lookup @@ -331,7 +346,7 @@ stat_t set_int8(nvObj_t *nv); // set signed 8 bit integer stat_t set_01(nvObj_t *nv); // set a 0 or 1 value with validation stat_t set_012(nvObj_t *nv); // set a 0, 1 or 2 value with validation stat_t set_0123(nvObj_t *nv); // set a 0, 1, 2 or 3 value with validation -stat_t set_int32(nvObj_t *nv); // set uint32_t integer value +stat_t set_int32(nvObj_t *nv); // set int32_t integer value stat_t set_data(nvObj_t *nv); // set uint32_t integer value blind cast stat_t set_flt(nvObj_t *nv); // set floating point value @@ -339,7 +354,7 @@ stat_t get_nul(nvObj_t *nv); // get null value type stat_t get_bool(nvObj_t *nv); // get boolean value stat_t get_ui8(nvObj_t *nv); // get uint8_t value stat_t get_int8(nvObj_t *nv); // get signed 8 bit integer -stat_t get_int32(nvObj_t *nv); // get uint32_t integer value +stat_t get_int32(nvObj_t *nv); // get int32_t integer value stat_t get_data(nvObj_t *nv); // get uint32_t integer value blind cast stat_t get_flt(nvObj_t *nv); // get floating point value @@ -372,8 +387,8 @@ stat_t set_float_range(nvObj_t *nv, float &value, float low, float high); stat_t get_int(nvObj_t *nv, const uint8_t value); // boilerplate for retrieving 8 bit integer value stat_t set_int(nvObj_t *nv, uint8_t &value, uint8_t low, uint8_t high); -stat_t get_int32(nvObj_t *nv, const uint32_t value); // boilerplate for retrieving 32 bit integer value -stat_t set_int32(nvObj_t *nv, uint32_t &value, uint32_t low, uint32_t high); +stat_t get_int32(nvObj_t *nv, const int32_t value); // boilerplate for retrieving 32 bit integer value +stat_t set_int32(nvObj_t *nv, int32_t &value, int32_t low, int32_t high); stat_t get_string(nvObj_t *nv, const char *str); diff --git a/g2core/config_app.cpp b/g2core/config_app.cpp index baf1eebe..b27dea30 100644 --- a/g2core/config_app.cpp +++ b/g2core/config_app.cpp @@ -648,7 +648,7 @@ const cfgItem_t cfgArray[] = { { "sys","jv", _fipn, 0, js_print_jv, js_get_jv, js_set_jv, (float *)&cs.null, JSON_VERBOSITY }, { "sys","qv", _fipn, 0, qr_print_qv, qr_get_qv, qr_set_qv, (float *)&cs.null, QUEUE_REPORT_VERBOSITY }, { "sys","sv", _fipn, 0, sr_print_sv, sr_get_sv, sr_set_sv, (float *)&cs.null, STATUS_REPORT_VERBOSITY }, - { "sys","si", _fipn, 0, sr_print_si, sr_get_si, sr_set_si, (float *)&cs.null, STATUS_REPORT_INTERVAL_MS }, + { "sys","si", _iipn, 0, sr_print_si, sr_get_si, sr_set_si, (float *)&cs.null, STATUS_REPORT_INTERVAL_MS }, // Gcode defaults // NOTE: The ordering within the gcode defaults is important for token resolution. gc must follow gco @@ -1397,30 +1397,34 @@ stat_t set_int(nvObj_t *nv, uint8_t &value, uint8_t low, uint8_t high) { return (STAT_OK); } -stat_t get_int32(nvObj_t *nv, const uint32_t value) { - nv->value = value; +stat_t get_int32(nvObj_t *nv, const int32_t value) { +//+++++ nv->value = value; + nv->value_int = value; nv->valuetype = TYPE_INT; return STAT_OK; } -stat_t set_int32(nvObj_t *nv, uint32_t &value, uint32_t low, uint32_t high) { +stat_t set_int32(nvObj_t *nv, int32_t &value, int32_t low, int32_t high) { char msg[64]; - if (nv->value < low) { +//+++++ if (nv->value < low) { + if (nv->value_int < low) { sprintf(msg, "Input is less than minimum value %lu", low); nv_add_conditional_message(msg); nv->valuetype = TYPE_NULL; return (STAT_INPUT_LESS_THAN_MIN_VALUE); } - if (nv->value > high) { +//+++++ if (nv->value > high) { + if (nv->value_int > high) { sprintf(msg, "Input is more than maximum value %lu", high); nv_add_conditional_message(msg); nv->valuetype = TYPE_NULL; return (STAT_INPUT_EXCEEDS_MAX_VALUE); } - value = nv->value; // note: valuetype = TYPE_INT already set - nv->valuetype = TYPE_INT; +// value = nv->value; // note: valuetype = TYPE_INT already set + value = nv->value_int; // note: valuetype = TYPE_INT already set + nv->valuetype = TYPE_INT32; return (STAT_OK); } diff --git a/g2core/gcode.h b/g2core/gcode.h index f3dede09..0a0e9e9f 100644 --- a/g2core/gcode.h +++ b/g2core/gcode.h @@ -211,7 +211,7 @@ typedef enum { // axis modes (ordered: see _cm_get_feed_time()) */ typedef struct GCodeState { // Gcode model state - used by model, planning and runtime - uint32_t linenum; // Gcode block line number + int32_t linenum; // Gcode block line number cmMotionMode motion_mode; // Group1: G0, G1, G2, G3, G38.2, G80, G81, G82 // G83, G84, G85, G86, G87, G88, G89 diff --git a/g2core/json_parser.cpp b/g2core/json_parser.cpp index cfd04bc5..f1fbb941 100644 --- a/g2core/json_parser.cpp +++ b/g2core/json_parser.cpp @@ -45,7 +45,7 @@ jsSingleton_t js; static stat_t _json_parser_kernal(nvObj_t *nv, char *str); static stat_t _json_parser_execute(nvObj_t *nv); static stat_t _normalize_json_string(char *str, uint16_t size); -static stat_t _get_nv_pair(nvObj_t *nv, char **pstr, int8_t *depth); +static stat_t _get_nv_pair(nvObj_t *nv, char **pstr, int8_t *depth, uint32_t *value_int); /**************************************************************************** * json_parser() - exposed part of JSON parser @@ -97,7 +97,6 @@ void json_parser(char *str) return; } nv_print_list(status, TEXT_MULTILINE_FORMATTED, JSON_RESPONSE_FORMAT); -// nv_print_list(status, TEXT_NO_PRINT, JSON_RESPONSE_FORMAT); sr_request_status_report(SR_REQUEST_TIMED); // generate incremental status report to show any changes } @@ -135,10 +134,22 @@ static stat_t _json_parser_execute(nvObj_t *nv) { return (STAT_OK); // only successful commands exit through this point } +// Return valueType defined for this variable. +// Currently just (f)loat and (int) + +static valueType _value_type_defined(index_t i) +{ + if (cfgArray[i].flags & F_INT32) { + return (TYPE_INT32); + } + return (TYPE_FLOAT); +} + static stat_t _json_parser_kernal(nvObj_t *nv, char *str) { stat_t status; int8_t depth; + uint32_t value_int = 0; char group[GROUP_LEN+1] = {""}; // group identifier - starts as NUL int8_t i = NV_BODY_LEN; @@ -155,7 +166,7 @@ static stat_t _json_parser_kernal(nvObj_t *nv, char *str) } // Use relaxed parser. Will read either strict or relaxed mode. To use strict-only parser refer // to build earlier than 407.03. Substitute _get_nv_pair_strict() for _get_nv_pair() - if ((status = _get_nv_pair(nv, &str, &depth)) > STAT_EAGAIN) { // erred out + if ((status = _get_nv_pair(nv, &str, &depth, &value_int)) > STAT_EAGAIN) { // erred out nv->valuetype = TYPE_NULL; return (status); } @@ -171,6 +182,10 @@ static stat_t _json_parser_kernal(nvObj_t *nv, char *str) if ((nv_index_is_group(nv->index)) && (nv_group_is_prefixed(nv->token))) { strncpy(group, nv->token, GROUP_LEN); // record the group ID } + if (_value_type_defined(nv->index) == TYPE_INT32) { // change out the float for an int32 + nv->value_int = value_int; + nv->valuetype = TYPE_INT32; + } if ((nv = nv->nx) == NULL) { return (STAT_JSON_TOO_MANY_PAIRS); // Not supposed to encounter a NULL } @@ -236,7 +251,7 @@ static stat_t _normalize_json_string(char *str, uint16_t size) * See build 406.xx or earlier for strict JSON parser - deleted in 407.03 */ -static stat_t _get_nv_pair(nvObj_t *nv, char **pstr, int8_t *depth) +static stat_t _get_nv_pair(nvObj_t *nv, char **pstr, int8_t *depth, uint32_t *value_int) { uint8_t i; char *tmp; @@ -290,6 +305,7 @@ static stat_t _get_nv_pair(nvObj_t *nv, char **pstr, int8_t *depth) // numbers } else if (isdigit(**pstr) || (**pstr == '-')) { // value is a number + *value_int = atol(*pstr); // get number as an integer first (non destructive) nv->value = (float)strtod(*pstr, &tmp); // tmp is the end pointer if ((tmp == *pstr) || // if start pointer equals end the conversion failed @@ -428,6 +444,9 @@ uint16_t json_serialize(nvObj_t *nv, char *out_buf, uint16_t size) str += sprintf(str, "%d", (int)nv->value); break; } + case (TYPE_INT32): { str += sprintf(str, "%d", (int)nv->value_int); + break; + } case (TYPE_STRING): { *str++ = '"'; strcpy(str, *nv->stringp); str += strlen(*nv->stringp); diff --git a/g2core/report.h b/g2core/report.h index 31514a73..197a32e8 100644 --- a/g2core/report.h +++ b/g2core/report.h @@ -61,7 +61,7 @@ typedef struct srSingleton { /*** config values (PUBLIC) ***/ srVerbosity status_report_verbosity; - uint32_t status_report_interval; // in milliseconds + int32_t status_report_interval; // in milliseconds /*** runtime values (PRIVATE) ***/ srVerbosity status_report_request; // flag that SR has been requested, and what type