diff --git a/TFT/src/User/API/comment.c b/TFT/src/User/API/comment.c index 9fa071ff74..969419f236 100644 --- a/TFT/src/User/API/comment.c +++ b/TFT/src/User/API/comment.c @@ -1,12 +1,11 @@ #include "comment.h" #include "includes.h" -#include -#define TOKEN_DELIMITERS " :=_" -#define HIGH_TO_LOW_CASE 32 // 'a' - 'A' +#define TOKEN_DELIMITERS " :=_" // possible delimiters found in the comments of the G-code file +#define KEYWORD_INTIALS "lLrRtT" // the initials of the searched keywords, add new initials for new keywords char gCodeCommentLine[COMMENT_MAX_CHAR] = {0}; -bool slicerTimePresence = false; +static bool slicerTimePresence = false; void setTimeFromSlicer(bool present) { @@ -18,95 +17,76 @@ void parseComment(void) if (gCodeCommentLine[0] == '\0') return; - char * temp_char = strtok(gCodeCommentLine, TOKEN_DELIMITERS); - uint32_t temp_value = 0; + // - check for words starting with "l", "L", "r", "R", "t" or "T" + // It is done so for speed purposes, it is a waste of MCU cycles to extract + // tokens, convert them to lower case and check if they are among the known + // keywords if they do not start with the above mentioned letters. + if (strchr(KEYWORD_INTIALS, gCodeCommentLine[0]) != NULL) + { + char * token; + uint32_t token_value; - strlwr(temp_char); + token = strToLwr(strtok(gCodeCommentLine, TOKEN_DELIMITERS)); - switch (gCodeCommentLine[0]) - { - case 'l': - case 'L': + // check for "layer" keyword in comment (layer number or layer count) + if (strcmp(token, "layer") == 0) { - if (strcmp(temp_char, "layer") == 0) + token = strToLwr(strtok(NULL, TOKEN_DELIMITERS)); + + if (strcmp(token, "count") == 0) // check if next word is "count" { - // check for "layer" keyword in comment (layer number or layer count) - temp_char = strtok(NULL, TOKEN_DELIMITERS); - strlwr(temp_char); - - if (strcmp(temp_char, "count") == 0) // check if next word is "count" - { - temp_char = strtok(NULL, TOKEN_DELIMITERS); - temp_value = strtoul(temp_char, NULL, 0); - - if (temp_value != 0) - setPrintLayerCount(temp_value); - } - else if (NUMERIC(temp_char[0])) // check if a number is found - { - temp_value = strtoul(temp_char, NULL, 0); - // "temp_value == 0" for object by object printing, when print goes to the next object - // if there is "layer 0" add an offset of 1 (avoiding using an offset variable) - setPrintLayerNumber(((temp_value == 0) || (getPrintLayerNumber() == temp_value)) ? temp_value + 1 : temp_value); - } + token = strtok(NULL, TOKEN_DELIMITERS); + token_value = strtoul(token, NULL, 0); + + if (token_value != 0) + setPrintLayerCount(token_value); + } + else if (NUMERIC(token[0])) // check if a number is found + { + token_value = strtoul(token, NULL, 0); + // "token_value == 0" for object by object printing, when print goes to the next object + // if there is "layer 0" add an offset of 1 (avoiding using an offset variable) + setPrintLayerNumber(((token_value == 0) || (getPrintLayerNumber() == token_value)) ? token_value + 1: token_value); } - // continue here with "else if" for another token that starts with "l" or "L" - break; } - case 't': - case 'T': + // check for "time" keyword in comment to retrieve total or elapsed time, Cura specific + else if (strcmp(token, "time") == 0 && slicerTimePresence == false) // check if first word is "time" { - // check for "time" keyword in comment to retrieve total or elapsed time, Cura specific - if (strcmp(temp_char, "time") == 0 && slicerTimePresence == false) // check if first word is "time" + token = strToLwr(strtok(NULL, TOKEN_DELIMITERS)); + + if (strcmp(token, "elapsed") == 0 && getPrintExpectedTime() > 0) // check if next word is "elapsed" { - temp_char = strtok(NULL, TOKEN_DELIMITERS); - strlwr(temp_char); - - if (strcmp(temp_char, "elapsed") == 0 && getPrintExpectedTime() > 0) // check if next word is "elapsed" - { - temp_char = strtok(NULL, TOKEN_DELIMITERS); - temp_value = strtoul(temp_char, NULL, 0); // get the elapsed time in seconds - setPrintRemainingTime(getPrintExpectedTime() - temp_value); - } - else if (temp_char[0] >= '0' && temp_char[0] <= '9') // check if a number is found - { - setPrintExpectedTime(strtoul(temp_char, NULL, 0)); - setPrintRemainingTime(getPrintExpectedTime()); - - if (getPrintProgressSource() < PROG_TIME && infoSettings.prog_source == 1) - setPrintProgressSource(PROG_TIME); - } + token = strtok(NULL, TOKEN_DELIMITERS); + token_value = strtoul(token, NULL, 0); // get the elapsed time in seconds + setPrintRemainingTime(getPrintExpectedTime() - token_value); + } + else if (NUMERIC(token[0])) // check if a number is found + { + token_value = strtoul(token, NULL, 0); // get the time in seconds + setPrintExpectedTime(token_value); + setPrintRemainingTime(token_value); + + if (getPrintProgressSource() < PROG_TIME && infoSettings.prog_source == 1) + setPrintProgressSource(PROG_TIME); } - // continue here with "else if" for another token that starts with "t" or "T" - break; } - case 'r': - case 'R': + // check for "remaining" keyword in comment to retrieve remaining time, IdeaMaker specific + else if (strcmp(token, "remaining") == 0 && slicerTimePresence == false) // check if first word is "remaining" { - // check for "remaining" keyword in comment to retrieve remaining time, IdeaMaker specific - if (strcmp(temp_char, "remaining") == 0 && slicerTimePresence == false) // check if first word is "remaining" + token = strToLwr(strtok(NULL, TOKEN_DELIMITERS)); + + if (strcmp(token, "time") == 0) // check if next word is "time" { - temp_char = strtok(NULL, TOKEN_DELIMITERS); - strlwr(temp_char); - - if (strcmp(temp_char, "time") == 0) // check if next word is "time" - { - temp_char = strtok(NULL, TOKEN_DELIMITERS); - temp_value = strtoul(temp_char, NULL, 0); // get the remaining time in seconds - setPrintRemainingTime(temp_value); - - if (getPrintProgressSource() < PROG_TIME && infoSettings.prog_source == 1) - setPrintProgressSource(PROG_TIME); - } + token = strtok(NULL, TOKEN_DELIMITERS); + token_value = strtoul(token, NULL, 0); // get the remaining time in seconds + setPrintRemainingTime(token_value); + + if (getPrintProgressSource() < PROG_TIME && infoSettings.prog_source == 1) + setPrintProgressSource(PROG_TIME); } - // continue here with "else if" for another token that starts with "r" or "R" - break; } - - default: - break; } gCodeCommentLine[0] = '\0'; diff --git a/TFT/src/User/API/comment.h b/TFT/src/User/API/comment.h index e914870e09..46d1b05f5e 100644 --- a/TFT/src/User/API/comment.h +++ b/TFT/src/User/API/comment.h @@ -6,7 +6,6 @@ extern "C" { #endif #include -#include #define COMMENT_MAX_CHAR 100 diff --git a/TFT/src/User/my_misc.c b/TFT/src/User/my_misc.c index 3aa686c38e..a7a295f756 100644 --- a/TFT/src/User/my_misc.c +++ b/TFT/src/User/my_misc.c @@ -5,6 +5,7 @@ #include #define CRC_POLY 0xA001 +#define HIGH_TO_LOW_CASE 32 // 'a' - 'A' uint8_t inRange(int cur, int tag , int range) { @@ -174,6 +175,35 @@ double strtod_ligth(char *str, char **endptr) return val * sign; } +// converts a string to lower case, returns the pointer of said string +char * strToLwr(char * string) +{ + char * tmp_str = string; + while (*tmp_str != '\0') + { + if (UPPER_CASE(*tmp_str)) + *tmp_str |= HIGH_TO_LOW_CASE; + tmp_str++; + } + + return string; +} + +// converts a string to upper case, returns the pointer of said string +char * strToUpr(char * string) +{ + char * tmp_str = string; + while (*tmp_str != '\0') + { + if (LOWER_CASE(*tmp_str)) + *tmp_str &= ~HIGH_TO_LOW_CASE; + tmp_str++; + } + + return string; +} + + // light weight and safe strncpy() function with padding: // - copy "src" to "dest" for a maximum of "n-1" characters // - if null terminating character is found in "src" the rest in "dest" is padded with '\0' diff --git a/TFT/src/User/my_misc.h b/TFT/src/User/my_misc.h index 56d3c929ef..d472d1117a 100644 --- a/TFT/src/User/my_misc.h +++ b/TFT/src/User/my_misc.h @@ -29,6 +29,8 @@ extern "C" { #define WITHIN(N, L, H) ((N) >= (L) && (N) <= (H)) #define NUMERIC(a) WITHIN(a, '0', '9') +#define LOWER_CASE(c) WITHIN(c, 'a', 'z') +#define UPPER_CASE(c) WITHIN(c, 'A', 'Z') // Bitwise macros @@ -91,6 +93,9 @@ double strtod_ligth(char *str, char **endptr); // light weight str void strncpy_pad(char *dest, const char *src, size_t n); // light weight and safe strncpy() function with padding void strncpy_no_pad(char *dest, const char *src, size_t n); // light weight and safe strncpy() function without padding +char * strToLwr(char * string); // converts a string to lower case, returns the pointer of said string +char * strToUpr(char * string); // converts a string to upper case, returns the pointer of said string + const char *stripHead(const char *str); // strip out any leading " ", "/" or ":" character that might be in the string void stripChecksum(char *str); // strip out any trailing checksum that might be in the string uint8_t getChecksum(char *str);