2018 revision to classic DataBus AVC code.

Dependencies:   LSM303DLM Servo SerialGraphicLCD L3G4200D IncrementalEncoder SimpleShell

Committer:
shimniok
Date:
Mon Jan 07 16:47:33 2019 +0000
Revision:
44:0d72a8a1288a
Parent:
36:3095e00eef37
Rewrote TinyGPS -> NMEA, GPS::read() now returns struct

Who changed what in which revision?

UserRevisionLine numberNew contents of line
shimniok 4:de7feb458652 1 #include "Config.h"
shimniok 5:eff573d4ede7 2 #include <ctype.h>
shimniok 5:eff573d4ede7 3
shimniok 5:eff573d4ede7 4
shimniok 7:1f2661b840ed 5 Config::Config()
shimniok 7:1f2661b840ed 6 {
shimniok 7:1f2661b840ed 7 itable = 0;
shimniok 7:1f2661b840ed 8
shimniok 7:1f2661b840ed 9 return;
shimniok 7:1f2661b840ed 10 }
shimniok 7:1f2661b840ed 11
shimniok 5:eff573d4ede7 12 char *trim(char *s)
shimniok 5:eff573d4ede7 13 {
shimniok 5:eff573d4ede7 14 char *t = s;
shimniok 5:eff573d4ede7 15
shimniok 5:eff573d4ede7 16 // rtrim
shimniok 5:eff573d4ede7 17 t = s + strlen(s) - 1;
shimniok 5:eff573d4ede7 18 while (isspace(*t))
shimniok 5:eff573d4ede7 19 *t = '\0';
shimniok 5:eff573d4ede7 20
shimniok 5:eff573d4ede7 21 // ltrim
shimniok 5:eff573d4ede7 22 while (*s && isspace(*s))
shimniok 7:1f2661b840ed 23 s++;
shimniok 5:eff573d4ede7 24
shimniok 5:eff573d4ede7 25 return s;
shimniok 7:1f2661b840ed 26 }
shimniok 7:1f2661b840ed 27
shimniok 7:1f2661b840ed 28
shimniok 7:1f2661b840ed 29 // convert character to an int
shimniok 7:1f2661b840ed 30 //
shimniok 7:1f2661b840ed 31 int ctoi(char c)
shimniok 7:1f2661b840ed 32 {
shimniok 7:1f2661b840ed 33 int i=-1;
shimniok 7:1f2661b840ed 34
shimniok 7:1f2661b840ed 35 if (c >= '0' && c <= '9') {
shimniok 7:1f2661b840ed 36 i = c - '0';
shimniok 7:1f2661b840ed 37 }
shimniok 7:1f2661b840ed 38
shimniok 7:1f2661b840ed 39 //printf("char: %c int %d\n", c, i);
shimniok 7:1f2661b840ed 40
shimniok 7:1f2661b840ed 41 return i;
shimniok 7:1f2661b840ed 42 }
shimniok 7:1f2661b840ed 43
shimniok 7:1f2661b840ed 44
shimniok 7:1f2661b840ed 45 // convert string to floating point
shimniok 7:1f2661b840ed 46 //
shimniok 7:1f2661b840ed 47 double cvstof(char *s)
shimniok 7:1f2661b840ed 48 {
shimniok 7:1f2661b840ed 49 double f=0.0;
shimniok 7:1f2661b840ed 50 double mult = 0.1;
shimniok 7:1f2661b840ed 51 bool neg = false;
shimniok 7:1f2661b840ed 52 //char dec = 1;
shimniok 7:1f2661b840ed 53
shimniok 7:1f2661b840ed 54 // leading spaces
shimniok 7:1f2661b840ed 55 while (*s == ' ' || *s == '\t') {
shimniok 7:1f2661b840ed 56 s++;
shimniok 7:1f2661b840ed 57 if (*s == 0) break;
shimniok 7:1f2661b840ed 58 }
shimniok 7:1f2661b840ed 59
shimniok 7:1f2661b840ed 60 // What about negative numbers?
shimniok 7:1f2661b840ed 61 if (*s == '-') {
shimniok 7:1f2661b840ed 62 neg = true;
shimniok 7:1f2661b840ed 63 s++;
shimniok 7:1f2661b840ed 64 }
shimniok 7:1f2661b840ed 65
shimniok 7:1f2661b840ed 66 // before the decimal
shimniok 7:1f2661b840ed 67 //
shimniok 7:1f2661b840ed 68 while (*s != 0) {
shimniok 7:1f2661b840ed 69 if (*s == '.') {
shimniok 7:1f2661b840ed 70 s++;
shimniok 7:1f2661b840ed 71 break;
shimniok 7:1f2661b840ed 72 }
shimniok 7:1f2661b840ed 73 f = (f * 10.0) + (double) ctoi(*s);
shimniok 7:1f2661b840ed 74 s++;
shimniok 7:1f2661b840ed 75 }
shimniok 7:1f2661b840ed 76 // after the decimal
shimniok 7:1f2661b840ed 77 while (*s != 0 && *s >= '0' && *s <= '9') {
shimniok 7:1f2661b840ed 78 f += (double) ctoi(*s) * mult;
shimniok 7:1f2661b840ed 79 mult /= 10;
shimniok 7:1f2661b840ed 80 s++;
shimniok 7:1f2661b840ed 81 }
shimniok 7:1f2661b840ed 82
shimniok 7:1f2661b840ed 83 // if we were negative...
shimniok 7:1f2661b840ed 84 if (neg) f = -f;
shimniok 7:1f2661b840ed 85
shimniok 7:1f2661b840ed 86 return f;
shimniok 7:1f2661b840ed 87 }
shimniok 4:de7feb458652 88
shimniok 4:de7feb458652 89
shimniok 4:de7feb458652 90 int Config::load(char *filename)
shimniok 4:de7feb458652 91 {
shimniok 4:de7feb458652 92 char buf[MAXBUF];
shimniok 4:de7feb458652 93 char *key;
shimniok 4:de7feb458652 94 char *value;
shimniok 4:de7feb458652 95 int status=0;
shimniok 4:de7feb458652 96 FILE *fp;
shimniok 4:de7feb458652 97
shimniok 4:de7feb458652 98 fp = fopen(filename, "r");
shimniok 4:de7feb458652 99 if (fp == NULL) {
shimniok 4:de7feb458652 100 status = -1;
shimniok 4:de7feb458652 101 } else {
shimniok 4:de7feb458652 102 while (!feof(fp)) {
shimniok 4:de7feb458652 103 fgets(buf, MAXBUF-1, fp);
shimniok 5:eff573d4ede7 104
shimniok 5:eff573d4ede7 105 char *t = buf;
shimniok 5:eff573d4ede7 106 char *s = buf;
shimniok 5:eff573d4ede7 107 // trim spaces and terminate at #
shimniok 5:eff573d4ede7 108 while (*t) {
shimniok 5:eff573d4ede7 109 if (isspace(*buf)) {
shimniok 5:eff573d4ede7 110 s = t;
shimniok 5:eff573d4ede7 111 } else if (*t == '#') {
shimniok 5:eff573d4ede7 112 *t = '\0';
shimniok 4:de7feb458652 113 }
shimniok 5:eff573d4ede7 114 t++;
shimniok 5:eff573d4ede7 115 }
shimniok 5:eff573d4ede7 116
shimniok 5:eff573d4ede7 117 key = strtok(s, ":#");
shimniok 5:eff573d4ede7 118 value = strtok(NULL, ":#");
shimniok 5:eff573d4ede7 119 if (key && value && *key && *value) {
shimniok 5:eff573d4ede7 120 key = trim(key);
shimniok 5:eff573d4ede7 121 value = trim(value);
shimniok 7:1f2661b840ed 122 assign(key, value);
shimniok 4:de7feb458652 123 }
shimniok 4:de7feb458652 124 }
shimniok 4:de7feb458652 125 fclose(fp);
shimniok 8:ba70bb062aa0 126 }
shimniok 4:de7feb458652 127
shimniok 8:ba70bb062aa0 128 for (int i=0; i < itable; i++) {
shimniok 8:ba70bb062aa0 129 printf("%s = ", table[i].key);
shimniok 8:ba70bb062aa0 130 switch (table[i].format) {
shimniok 8:ba70bb062aa0 131 case DOUBLE:
shimniok 8:ba70bb062aa0 132 printf("%f\n", table[i].value.d);
shimniok 8:ba70bb062aa0 133 break;
shimniok 8:ba70bb062aa0 134 case INT:
shimniok 8:ba70bb062aa0 135 printf("%d\n", table[i].value.i);
shimniok 8:ba70bb062aa0 136 break;
shimniok 8:ba70bb062aa0 137 default:
shimniok 8:ba70bb062aa0 138 break;
shimniok 8:ba70bb062aa0 139 }
shimniok 8:ba70bb062aa0 140
shimniok 8:ba70bb062aa0 141 }
shimniok 4:de7feb458652 142 return status;
shimniok 4:de7feb458652 143 }
shimniok 7:1f2661b840ed 144
shimniok 7:1f2661b840ed 145
shimniok 7:1f2661b840ed 146 void Config::add(char *key, char format)
shimniok 7:1f2661b840ed 147 {
shimniok 7:1f2661b840ed 148 if (key && itable < MAXTBL) {
shimniok 7:1f2661b840ed 149 strncpy(table[itable].key, key, MAXSTR);
shimniok 7:1f2661b840ed 150 table[itable].format = format;
shimniok 7:1f2661b840ed 151 itable++;
shimniok 7:1f2661b840ed 152 }
shimniok 7:1f2661b840ed 153
shimniok 7:1f2661b840ed 154 return;
shimniok 7:1f2661b840ed 155 }
shimniok 7:1f2661b840ed 156
shimniok 7:1f2661b840ed 157
shimniok 7:1f2661b840ed 158 int Config::assign(char *key, char *value)
shimniok 7:1f2661b840ed 159 {
shimniok 7:1f2661b840ed 160 int found = 0;
shimniok 7:1f2661b840ed 161 int status = 0;
shimniok 7:1f2661b840ed 162 char format = 0;
shimniok 7:1f2661b840ed 163
shimniok 7:1f2661b840ed 164 // lookup
shimniok 7:1f2661b840ed 165 for (int i=0; i < itable; i++) {
shimniok 7:1f2661b840ed 166 if (!strncmp(table[i].key, key, MAXSTR)) {
shimniok 7:1f2661b840ed 167 found = 1;
shimniok 7:1f2661b840ed 168 format = table[i].format;
shimniok 7:1f2661b840ed 169 // assignment
shimniok 7:1f2661b840ed 170 switch (format) {
shimniok 7:1f2661b840ed 171 case DOUBLE :
shimniok 7:1f2661b840ed 172 table[i].value.d = atof(value);
shimniok 7:1f2661b840ed 173 break;
shimniok 7:1f2661b840ed 174 case INT :
shimniok 7:1f2661b840ed 175 table[i].value.i = atoi(value);
shimniok 7:1f2661b840ed 176 break;
shimniok 7:1f2661b840ed 177 default:
shimniok 7:1f2661b840ed 178 break;
shimniok 7:1f2661b840ed 179 }
shimniok 7:1f2661b840ed 180 break;
shimniok 7:1f2661b840ed 181 }
shimniok 7:1f2661b840ed 182 }
shimniok 7:1f2661b840ed 183
shimniok 7:1f2661b840ed 184 if (!found) {
shimniok 7:1f2661b840ed 185 status = 1;
shimniok 7:1f2661b840ed 186 printf("key not found: %s\n", key);
shimniok 7:1f2661b840ed 187 }
shimniok 7:1f2661b840ed 188
shimniok 7:1f2661b840ed 189 return status;
shimniok 9:fc3575d2cbbf 190 }
shimniok 9:fc3575d2cbbf 191
shimniok 9:fc3575d2cbbf 192
shimniok 9:fc3575d2cbbf 193 int Config::get(char *key, double *value)
shimniok 9:fc3575d2cbbf 194 {
shimniok 9:fc3575d2cbbf 195 int status = 0;
shimniok 9:fc3575d2cbbf 196
shimniok 9:fc3575d2cbbf 197 return status;
shimniok 9:fc3575d2cbbf 198 }
shimniok 9:fc3575d2cbbf 199
shimniok 9:fc3575d2cbbf 200 int Config::get(char *key, int *value)
shimniok 9:fc3575d2cbbf 201 {
shimniok 9:fc3575d2cbbf 202 int status = 0;
shimniok 9:fc3575d2cbbf 203
shimniok 9:fc3575d2cbbf 204 return status;
shimniok 7:1f2661b840ed 205 }