2018 revision to classic DataBus AVC code.

Dependencies:   LSM303DLM Servo SerialGraphicLCD L3G4200D IncrementalEncoder SimpleShell

Committer:
shimniok
Date:
Wed Dec 05 17:53:06 2018 +0000
Revision:
7:1f2661b840ed
Parent:
6:83a6666a62d7
Child:
8:ba70bb062aa0
Implemented keyword add and value assignment to Config. Testing keywords in main.

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 5:eff573d4ede7 122 printf("<%s>=<%s>\n", key, value);
shimniok 7:1f2661b840ed 123 assign(key, value);
shimniok 4:de7feb458652 124 }
shimniok 4:de7feb458652 125 }
shimniok 4:de7feb458652 126 fclose(fp);
shimniok 4:de7feb458652 127 };
shimniok 4:de7feb458652 128
shimniok 4:de7feb458652 129 return status;
shimniok 4:de7feb458652 130 }
shimniok 7:1f2661b840ed 131
shimniok 7:1f2661b840ed 132
shimniok 7:1f2661b840ed 133 void Config::add(char *key, char format)
shimniok 7:1f2661b840ed 134 {
shimniok 7:1f2661b840ed 135 if (key && itable < MAXTBL) {
shimniok 7:1f2661b840ed 136 strncpy(table[itable].key, key, MAXSTR);
shimniok 7:1f2661b840ed 137 table[itable].format = format;
shimniok 7:1f2661b840ed 138 itable++;
shimniok 7:1f2661b840ed 139 }
shimniok 7:1f2661b840ed 140
shimniok 7:1f2661b840ed 141 return;
shimniok 7:1f2661b840ed 142 }
shimniok 7:1f2661b840ed 143
shimniok 7:1f2661b840ed 144
shimniok 7:1f2661b840ed 145 int Config::assign(char *key, char *value)
shimniok 7:1f2661b840ed 146 {
shimniok 7:1f2661b840ed 147 int found = 0;
shimniok 7:1f2661b840ed 148 int status = 0;
shimniok 7:1f2661b840ed 149 char format = 0;
shimniok 7:1f2661b840ed 150
shimniok 7:1f2661b840ed 151 // lookup
shimniok 7:1f2661b840ed 152 for (int i=0; i < itable; i++) {
shimniok 7:1f2661b840ed 153 printf("%s\n", key);
shimniok 7:1f2661b840ed 154 if (!strncmp(table[i].key, key, MAXSTR)) {
shimniok 7:1f2661b840ed 155 found = 1;
shimniok 7:1f2661b840ed 156 format = table[i].format;
shimniok 7:1f2661b840ed 157 printf("found %s\n", key);
shimniok 7:1f2661b840ed 158 // assignment
shimniok 7:1f2661b840ed 159 switch (format) {
shimniok 7:1f2661b840ed 160 case DOUBLE :
shimniok 7:1f2661b840ed 161 table[i].value.d = atof(value);
shimniok 7:1f2661b840ed 162 break;
shimniok 7:1f2661b840ed 163 case INT :
shimniok 7:1f2661b840ed 164 table[i].value.i = atoi(value);
shimniok 7:1f2661b840ed 165 break;
shimniok 7:1f2661b840ed 166 default:
shimniok 7:1f2661b840ed 167 break;
shimniok 7:1f2661b840ed 168 }
shimniok 7:1f2661b840ed 169 break;
shimniok 7:1f2661b840ed 170 }
shimniok 7:1f2661b840ed 171 }
shimniok 7:1f2661b840ed 172
shimniok 7:1f2661b840ed 173 if (!found) {
shimniok 7:1f2661b840ed 174 status = 1;
shimniok 7:1f2661b840ed 175 printf("key not found: %s\n", key);
shimniok 7:1f2661b840ed 176 }
shimniok 7:1f2661b840ed 177
shimniok 7:1f2661b840ed 178 return status;
shimniok 7:1f2661b840ed 179 }