/* * rpt_init_status_report() * * Call this function to completely re-initialze the status report * Sets SR list to hard-coded defaults and re-initializes sr values in NVM */ void rpt_init_status_report() { cmdObj_t *cmd = cmd_reset_list(); // used for status report persistence locations char sr_defaults[CMD_STATUS_REPORT_LEN][CMD_TOKEN_LEN+1] = { SR_DEFAULTS }; // see settings.h cm.status_report_counter = (cfg.status_report_interval / RTC_MILLISECONDS); // RTC fires every 10 ms cmd->index = cmd_get_index("","se00"); // set first SR persistence index for (uint8_t i=0; i < CMD_STATUS_REPORT_LEN ; i++) { if (sr_defaults[i][0] == NUL) break; // quit on first blank array entry cfg.status_report_value[i] = -1234567; // pre-load values with an unlikely number cmd->value = cmd_get_index("", sr_defaults[i]); // load the index for the SR element cmd_set(cmd); cmd_persist(cmd); // conditionally persist - automatic by cmd_persis() cmd->index++; // increment SR NVM index } }
stat_t _json_parser_kernal(char *str) { uint8_t status; int8_t depth; cmdObj_t *cmd = cmd_reset_list(); // get a fresh cmdObj list char group[CMD_GROUP_LEN+1] = {""}; // group identifier - starts as NUL int8_t i = CMD_BODY_LEN; ritorno(_normalize_json_string(str, JSON_OUTPUT_STRING_MAX)); // return if error // parse the JSON command into the cmd body do { if (--i == 0) { return (STAT_JSON_TOO_MANY_PAIRS); } // length error if ((status = _get_nv_pair_strict(cmd, &str, &depth)) > STAT_EAGAIN) { // erred out return (status); } // propagate the group from previous NV pair (if relevant) if (group[0] != NUL) { strncpy(cmd->group, group, CMD_GROUP_LEN);// copy the parent's group to this child } // validate the token and get the index if ((cmd->index = cmd_get_index(cmd->group, cmd->token)) == NO_MATCH) { return (STAT_UNRECOGNIZED_COMMAND); } if ((cmd_index_is_group(cmd->index)) && (cmd_group_is_prefixed(cmd->token))) { strncpy(group, cmd->token, CMD_GROUP_LEN);// record the group ID } if ((cmd = cmd->nx) == NULL) return (STAT_JSON_TOO_MANY_PAIRS);// Not supposed to encounter a NULL } while (status != STAT_OK); // breaks when parsing is complete // execute the command cmd = cmd_body; if (cmd->objtype == TYPE_NULL){ // means GET the value ritorno(cmd_get(cmd)); // ritorno returns w/status on any errors } else { ritorno(cmd_set(cmd)); // set value or call a function (e.g. gcode) cmd_persist(cmd); } return (STAT_OK); // only successful commands exit through this point }
/**************************************************************************** * cmd_text_parser() - update a config setting from a text block (text mode) * _text_parser() - helper for above * * Use cases handled: * - $xfr=1200 set a parameter * - $xfr display a parameter * - $x display a group * - ? generate a status report (multiline format) */ uint8_t cmd_text_parser(char *str) { // return (SC_OK); // There is no text parser in this code - just JSON //} cmdObj_t *cmd = cmd_reset_list(); // returns first object in the body uint8_t status = SC_OK; // single-unit parser processing ritorno(_text_parser(str, cmd)); // decode the request or return if error if ((cmd->type == TYPE_PARENT) || (cmd->type == TYPE_NULL)) { if (cmd_get(cmd) == SC_COMPLETE) { // populate value, group values, or run uber-group displays return (SC_OK); // return for uber-group displays so they don't print twice } } else { // process SET and RUN commands status = cmd_set(cmd); // set single value cmd_persist(cmd); } cmd_print_list(status, TEXT_MULTILINE_FORMATTED, JSON_RESPONSE_FORMAT); // print the results return (status); return (SC_OK); }
/* * rpt_set_status_report() - interpret an sr setup string and return current report */ stat_t rpt_set_status_report(cmdObj_t *cmd) { uint8_t elements = 0; index_t status_report_list[CMD_STATUS_REPORT_LEN]; memset(status_report_list, 0, sizeof(status_report_list)); index_t sr_start = cmd_get_index("","se00"); // set first SR persistence index for (uint8_t i=0; i<CMD_STATUS_REPORT_LEN; i++) { if (((cmd = cmd->nx) == NULL) || (cmd->objtype == TYPE_EMPTY)) { break;} if ((cmd->objtype == TYPE_BOOL) && (cmd->value == true)) { status_report_list[i] = cmd->index; cmd->value = cmd->index; // persist the index as the value cmd->index = sr_start + i; // index of the SR persistence location cmd_persist(cmd); elements++; } else { return (STAT_INPUT_VALUE_UNSUPPORTED); } } if (elements == 0) { return (STAT_INPUT_VALUE_UNSUPPORTED);} memcpy(cfg.status_report_list, status_report_list, sizeof(status_report_list)); rpt_populate_unfiltered_status_report(); // return current values return (STAT_OK); }