(2x) speed increase in printFloat() function. Decimal places setting added.

- printFloat() function execution doubled in speed. This is a precursor
to status reporting, since GUIs may query real-time position rapidly.

- Decimal places added to settings (for now). This may disappear in
future pushes, but here for testing purposes.
This commit is contained in:
Sonny Jeon 2012-10-11 22:43:54 -06:00
parent d8ca4176bf
commit 9b4e108905
3 changed files with 44 additions and 22 deletions

57
print.c
View File

@ -27,6 +27,7 @@
#include <avr/pgmspace.h>
#include "config.h"
#include "serial.h"
#include "settings.h"
void printString(const char *s)
{
@ -88,12 +89,12 @@ static void print_uint32_base10(unsigned long n)
}
while (n > 0) {
buf[i++] = n % 10;
buf[i++] = n % 10 + '0';
n /= 10;
}
for (; i > 0; i--)
serial_write('0' + buf[i - 1]);
serial_write(buf[i-1]);
}
void printInteger(long n)
@ -105,27 +106,43 @@ void printInteger(long n)
print_uint32_base10(n);
}
void printFloat(double n)
// Convert float to string by immediately converting to a long integer, which contains
// more digits than a float. Number of decimal places, which are tracked by a counter,
// may be set by the user. The integer is then efficiently converted to a string.
void printFloat(float n)
{
if (n < 0) {
serial_write('-');
n = -n;
}
n += 0.5/DECIMAL_MULTIPLIER; // Add rounding factor
long integer_part;
integer_part = (int)n;
print_uint32_base10(integer_part);
serial_write('.');
n -= integer_part;
int decimals = DECIMAL_PLACES;
uint8_t decimal_part;
while(decimals-- > 0) {
n *= 10;
decimal_part = (int) n;
serial_write('0'+decimal_part);
n -= decimal_part;
uint8_t decimals = settings.decimal_places;
while (decimals >= 2) { // Quickly convert values expected to be E0 to E-4.
n *= 100;
decimals -= 2;
}
if (decimals) { n *= 10; }
n += 0.5; // Add rounding factor. Ensures carryover through entire value.
// Generate digits backwards and store in string.
unsigned char buf[10];
uint8_t i = 0;
uint32_t a = (long)n;
buf[settings.decimal_places] = '.'; // Place decimal point, even if decimal places are zero.
while(a > 0) {
if (i == settings.decimal_places) { i++; } // Skip decimal point location
buf[i++] = (a % 10) + '0'; // Get digit
a /= 10;
}
while (i < settings.decimal_places) {
buf[i++] = '0'; // Fill in zeros to decimal point for (n < 1)
}
if (i == settings.decimal_places) { // Fill in leading zero, if needed.
i++;
buf[i++] = '0';
}
// Print the generated string.
for (; i > 0; i--)
serial_write(buf[i-1]);
}

View File

@ -77,6 +77,7 @@ typedef struct {
// #define DEFAULT_AUTO_START 1 // true
// #define DEFAULT_INCHES_MODE 1 // true
// #define DEFAULT_BLOCK_DELETE 0 // false
#define DEFAULT_DECIMAL_PLACES 3
void settings_reset(bool reset_all) {
// Reset all settings or only the migration settings to the new version.
@ -101,6 +102,7 @@ void settings_reset(bool reset_all) {
settings.homing_seek_rate = DEFAULT_HOMING_RAPID_FEEDRATE;
settings.homing_debounce_delay = DEFAULT_HOMING_DEBOUNCE_DELAY;
settings.stepper_idle_lock_time = DEFAULT_STEPPER_IDLE_LOCK_TIME;
settings.decimal_places = DEFAULT_DECIMAL_PLACES;
}
void settings_dump() {
@ -120,7 +122,8 @@ void settings_dump() {
printPgmString(PSTR(" (mm/min homing feed rate)\r\n$12 = ")); printFloat(settings.homing_seek_rate);
printPgmString(PSTR(" (mm/min homing seek rate)\r\n$13 = ")); printInteger(settings.homing_debounce_delay);
printPgmString(PSTR(" (milliseconds homing debounce delay)\r\n$14 = ")); printInteger(settings.stepper_idle_lock_time);
printPgmString(PSTR(" (milliseconds stepper idle lock time)"));
printPgmString(PSTR(" (milliseconds stepper idle lock time)\r\n$15 = ")); printInteger(settings.decimal_places);
printPgmString(PSTR(" (float decimal places)"));
printPgmString(PSTR("\r\n'$x=value' to set parameter or just '$' to dump current settings\r\n"));
}
@ -235,6 +238,7 @@ void settings_store_setting(int parameter, float value) {
case 12: settings.homing_seek_rate = value; break;
case 13: settings.homing_debounce_delay = round(value); break;
case 14: settings.stepper_idle_lock_time = round(value); break;
case 15: settings.decimal_places = round(value); break;
default:
printPgmString(PSTR("Unknown parameter\r\n"));
return;

View File

@ -29,7 +29,7 @@
// Version of the EEPROM data. Will be used to migrate existing data from older versions of Grbl
// when firmware is upgraded. Always stored in byte 0 of eeprom
#define SETTINGS_VERSION 51
#define SETTINGS_VERSION 52
// Define bit flag masks in settings.flag.
#define FLAG_BIT_HOMING_ENABLE bit(0)
@ -52,6 +52,7 @@ typedef struct {
float homing_seek_rate;
uint16_t homing_debounce_delay;
uint8_t stepper_idle_lock_time;
uint8_t decimal_places;
} settings_t;
extern settings_t settings;