summaryrefslogtreecommitdiff
path: root/string_utils.c
diff options
context:
space:
mode:
authorMichael J. Chudobiak <mjc@avtechpulse.com>2012-08-30 11:38:48 -0400
committerMichael J. Chudobiak <mjc@avtechpulse.com>2012-08-30 11:38:48 -0400
commitd6c71646ddc4a34293bb5cadde78a30806d8eace (patch)
tree11ab0d737aca55ccf3e96df40cd8624f75c85dfd /string_utils.c
parent996f3d52275475f2478f377f12f0ef7571ecc795 (diff)
first attempt at lcd menus
Diffstat (limited to 'string_utils.c')
-rw-r--r--string_utils.c138
1 files changed, 126 insertions, 12 deletions
diff --git a/string_utils.c b/string_utils.c
index db077a7..95c643e 100644
--- a/string_utils.c
+++ b/string_utils.c
@@ -1,14 +1,3 @@
-/* START LIBRARY DESCRIPTION *********************************************
-FLOAT.LIB
- Copyright (c) 2006, Avtech Electrosystems Ltd.
-
-DESCRIPTION:
- Functions that deal with strings and floating point numbers.
-
-SUPPORT LIB'S:
-END DESCRIPTION **********************************************************/
-
-
#include <string.h>
#include <ctype.h>
#include <math.h>
@@ -16,6 +5,9 @@ END DESCRIPTION **********************************************************/
#include "globals.h"
#include "string_utils.h"
+#include "lcd.h" // FIXME
+
+
void Float_To_Text(int decimal_digits,float number_in, gchar ** text_out)
{
g_assert (*text_out == NULL);
@@ -33,7 +25,6 @@ void Float_To_Text(int decimal_digits,float number_in, gchar ** text_out)
}
-/*----------------------------------------------------------------------------------------------------------*/
gboolean String_is_it_numeric(char *parameter)
{
@@ -46,3 +37,126 @@ gboolean String_is_it_numeric(char *parameter)
g_regex_unref (numeric_regex);
return match;
}
+
+
+void String_Parameter_To_Text(float Float_To_Convert,int Int_To_Convert, int significant_digits,
+ char *start_string,char *units,char *LCD_string,int show_plus_sign)
+{
+ // FIXME - crappy string func
+ char out_val[LCD_col_width+1];
+ char floating_val[32];
+ char String_of_spaces[LCD_col_width+1];
+ char unit_mult[10]; /* units multiplier, eg. M, k, u */
+
+ int i; /* just a counter */
+ int shift_decimal_by; /* if the exponent isn't a multiple of 3, the decimal point will be moved */
+ int decimal_location; /* where the decimal is in the number string */
+ int chars_processed; /* how many characters are in the parsed number string so far */
+
+ int exponent_val; /* the exponent, in integer form */
+
+ /* Copy the floating point value to a string. Do not multiply to accomodate units; the roundoff */
+ /* is annoying. (e.g. 1.000 -> 0.999) */
+ /* Move the decimal with string manipulations instead. */
+
+ strcpy(LCD_string,start_string);
+
+ /* if significant_digits is zero, used the supplied integer rather than the floating number */
+
+ if (!significant_digits) {
+ sprintf(out_val, "%d", (int) Float_To_Convert);
+ strcat(LCD_string,out_val);
+ } else {
+ Float_To_Text(remote_digits_after_decimal,Float_To_Convert,floating_val);
+
+ /* -- COPY FIRST ONE OR TWO CHARACTERS -- */
+ if (floating_val[0]=='-') { /* if it's negative ... */
+ decimal_location=2; /* decimal at position two (e.g.: -2.23e-9) */
+ chars_processed=2; /* two characters so far (e.g.: -2) */
+ out_val[0]='-'; /* copy minus sign */
+ out_val[1]=floating_val[1]; /* copy first digit */
+ } else if (show_plus_sign==YES) { /* if it's positive and plus sign required ... */
+ decimal_location=1; /* decimal at position one (e.g.: 2.23e-9) */
+ chars_processed=2; /* two characters so far (e.g.: +2) */
+ out_val[0]='+'; /* add plus sign */
+ out_val[1]=floating_val[0]; /* copy first digit */
+ } else { /* if it's positive and plus sign not required ... */
+ decimal_location=1; /* decimal at position one (e.g.: 2.23e-9) */
+ chars_processed=1; /* one character so far (e.g.: 2) */
+ out_val[0]=floating_val[0]; /* copy first digit */
+ }
+
+ /* -- FIND EXPONENT -- */
+ /* find how much the decimal has to be moved, by examining the exponent in the string and */
+ /* modding it by 3 */
+ exponent_val = atoi(floating_val+strlen(floating_val)-3); /* read the last three characters */
+ /* e.g. +09, or -07 */
+
+ shift_decimal_by=(300+exponent_val) % 3; /* added 300 to keep everything positive */
+
+ /* -- PICK UNITS -- */
+ if (exponent_val<12 && exponent_val>=9) {
+ strcpy(unit_mult,"G");
+ } else if (exponent_val<9 && exponent_val>=6) {
+ strcpy(unit_mult,"M");
+ } else if (exponent_val<6 && exponent_val>=3) {
+ strcpy(unit_mult,"k");
+ } else if (exponent_val<3 && exponent_val>=0) {
+ strcpy(unit_mult,"");
+ } else if (exponent_val<0 && exponent_val>=-3) {
+ strcpy(unit_mult,"m");
+ } else if (exponent_val<-3 && exponent_val>=-6) {
+ strcpy(unit_mult,"u");
+ } else if (exponent_val<-6 && exponent_val>=-9) {
+ strcpy(unit_mult,"n");
+ } else if (exponent_val<-9 && exponent_val>=-12) {
+ strcpy(unit_mult,"p");
+ }
+
+ if (exponent_val<-12) {
+ strcpy(unit_mult,""); /* if parameter=0, don't use silly units */
+ }
+
+ /* -- MOVE DIGITS AROUND DECIMAL POINT -- */
+
+ /* move the digits that will come before the decimal */
+ for (i=decimal_location; i<decimal_location+shift_decimal_by; ++i) {
+ out_val[chars_processed]=floating_val[1+i];
+ ++chars_processed;
+ }
+
+ /* put in the new decimal point */
+ out_val[chars_processed]='.';
+ ++chars_processed;
+
+ /* copy the rest of the digits */
+ for (i=shift_decimal_by+1+decimal_location; i<significant_digits+3; ++i) {
+ out_val[chars_processed]=floating_val[i];
+ ++chars_processed;
+ /* leave space for minus sign, decimal point, and extra digit on the end too */
+ }
+
+ /* -- TERMINATE STRING -- */
+ if ((show_plus_sign==YES) || (floating_val[0]=='-')) {
+ out_val[significant_digits+3]=0;
+ } else {
+ out_val[significant_digits+2]=0;
+ }
+
+
+ /* -- FINISH UP -- */
+
+ strcat(LCD_string,out_val);
+ LCD_string[strlen(LCD_string)-1]=0; /* remove extra digit */
+
+ /* -- CHECK FOR TERMINATING DECIMAL POINT -- */
+ if (LCD_string[strlen(LCD_string)-1]=='.') {
+ LCD_string[strlen(LCD_string)-1]=0;
+ }
+
+ strcat(LCD_string,unit_mult);
+ }
+
+ strcat(LCD_string,units);
+}
+