/* * util.cpp - a random assortment of useful functions * Part of TinyG project * */ /* util contains a dog's breakfast of supporting functions that are * not specific to tinyg: including: * - math and min/max utilities and extensions * - vector manipulation utilities * - support for debugging routines */ #include "tinyg2.h" #include "util.h" /* #include #include // precursor for xio.h #include #include #include #include #include // precursor for xio.h #include "tinyg.h" #include "config.h" #include "controller.h" #include "canonical_machine.h" #include "planner.h" #include "stepper.h" #include "report.h" */ #ifdef __cplusplus extern "C"{ #endif /*** statically allocated global for vector operations ***/ float vector[AXES]; // vector used by util.cpp and other functions /* * strcpy_U() - strcpy workalike to get around initial NUL for blank string - possibly wrong */ uint8_t * strcpy_U( uint8_t * dst, const uint8_t * src ) { uint16_t index = 0; do { dst[index] = src[index]; } while (src[index++] != 0); return dst; // for (uint16_t index=0; src[index] != 0; index++) { // dst[index] = src[index]; // } // dst[index] = 0; // terminate string // return dst; } /**** Vector functions **** * copy_vector() - copy vector of arbitrary length * copy_axis_vector() - copy an axis vector * set_unit_vector() - populate a unit vector by pos. & target * get_axis_vector_length() - return the length of an axis vector * set_vector() - load values into vector form * set_vector_by_axis() - load a single value into a zero vector */ void copy_vector(float dest[], const float src[], uint8_t length) { for (uint8_t i=0; i max) { max = x2;} if (x3 > max) { return (x3);} return (max); } inline float max4(float x1, float x2, float x3, float x4) { float max = x1; if (x2 > max) { max = x2;} if (x3 > max) { max = x3;} if (x4 > max) { return (x4);} return (max); } /* * isnumber() - isdigit that also accepts plus, minus, and decimal point */ /* uint8_t isnumber(char_t c) { if (c == '.') { return (true); } if (c == '-') { return (true); } if (c == '+') { return (true); } return (isdigit(c)); } */ /* * read_float() - read a float from a normalized char array * * buf normalized char array (line) * i char array index must point to start of number * float_ptr pointer to float to write value into * * The line is normalized when it is all caps, has no white space, * no non-alphnumeric characters, and no newline or CR. */ uint8_t read_float(uint8_t *buf, uint8_t *index, float *float_ptr) { char_t *start = buf + *index; char_t *end; *float_ptr = (float)strtod(start, &end); if(end == start) { return(false); } *index = (uint8_t)(end - buf); return(true); } /* * compute_checksum() - calculate the checksum for a string * * Stops calculation on null termination or length value if non-zero. * * This is based on the the Java hashCode function. * See http://en.wikipedia.org/wiki/Java_hashCode() */ #define HASHMASK 9999 /* uint16_t compute_checksum(char_t const *string, const uint16_t length) { uint32_t h = 0; uint16_t len = strlen(string); if (length != 0) { len = min(len, length); } for (uint16_t i=0; i