2018 revision to classic DataBus AVC code.
Dependencies: LSM303DLM Servo SerialGraphicLCD L3G4200D IncrementalEncoder SimpleShell
Config.cpp@8:ba70bb062aa0, 2018-12-05 (annotated)
- Committer:
- shimniok
- Date:
- Wed Dec 05 18:02:32 2018 +0000
- Revision:
- 8:ba70bb062aa0
- Parent:
- 7:1f2661b840ed
- Child:
- 9:fc3575d2cbbf
Changes to printf statements, display list of key/value pairs.
Who changed what in which revision?
User | Revision | Line number | New 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 | 7:1f2661b840ed | 190 | } |