Andrew Boyson
/
iot
Backing up an unused program in case of future need
cfg.cpp@2:06fa34661f19, 2016-04-22 (annotated)
- Committer:
- andrewboyson
- Date:
- Fri Apr 22 09:23:57 2016 +0000
- Revision:
- 2:06fa34661f19
- Child:
- 6:be97d38e0b01
Added configuration file.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
andrewboyson | 2:06fa34661f19 | 1 | #include "mbed.h" |
andrewboyson | 2:06fa34661f19 | 2 | #include "log.h" |
andrewboyson | 2:06fa34661f19 | 3 | #define MAX_NAME_OR_VALUE 100 |
andrewboyson | 2:06fa34661f19 | 4 | #define FILE_NAME "/local/cfg.txt" |
andrewboyson | 2:06fa34661f19 | 5 | |
andrewboyson | 2:06fa34661f19 | 6 | char *CfgSsid; |
andrewboyson | 2:06fa34661f19 | 7 | char *CfgPassword; |
andrewboyson | 2:06fa34661f19 | 8 | char *CfgNtpIp; |
andrewboyson | 2:06fa34661f19 | 9 | int CfgBaud; |
andrewboyson | 2:06fa34661f19 | 10 | |
andrewboyson | 2:06fa34661f19 | 11 | static void saveString(char *value, char **dest) { |
andrewboyson | 2:06fa34661f19 | 12 | *dest = (char*)realloc(*dest, strlen(value) + 1); //strlen does not include the null so add 1 |
andrewboyson | 2:06fa34661f19 | 13 | if (*dest == NULL) |
andrewboyson | 2:06fa34661f19 | 14 | { |
andrewboyson | 2:06fa34661f19 | 15 | LogCrLf("Error reallocating memory in saveString"); |
andrewboyson | 2:06fa34661f19 | 16 | return; |
andrewboyson | 2:06fa34661f19 | 17 | } |
andrewboyson | 2:06fa34661f19 | 18 | *dest = strcpy(*dest, value); |
andrewboyson | 2:06fa34661f19 | 19 | } |
andrewboyson | 2:06fa34661f19 | 20 | static void saveInt (char *value, int *dest) { |
andrewboyson | 2:06fa34661f19 | 21 | *dest = atoi(value); |
andrewboyson | 2:06fa34661f19 | 22 | } |
andrewboyson | 2:06fa34661f19 | 23 | static void rtrim (int i, char *s) { //i is the length of the thing to trim |
andrewboyson | 2:06fa34661f19 | 24 | while(1) |
andrewboyson | 2:06fa34661f19 | 25 | { |
andrewboyson | 2:06fa34661f19 | 26 | s[i] = '\0'; |
andrewboyson | 2:06fa34661f19 | 27 | if (--i < 0) break; |
andrewboyson | 2:06fa34661f19 | 28 | if (s[i] != ' ' && s[i] != '\t') break; |
andrewboyson | 2:06fa34661f19 | 29 | } |
andrewboyson | 2:06fa34661f19 | 30 | } |
andrewboyson | 2:06fa34661f19 | 31 | |
andrewboyson | 2:06fa34661f19 | 32 | static void handleLine(int n, int v, char *name, char *value) { |
andrewboyson | 2:06fa34661f19 | 33 | rtrim(n, name); |
andrewboyson | 2:06fa34661f19 | 34 | rtrim(v, value); |
andrewboyson | 2:06fa34661f19 | 35 | if (strcmp(name, "ssid") == 0) saveString (value, &CfgSsid); |
andrewboyson | 2:06fa34661f19 | 36 | if (strcmp(name, "password") == 0) saveString (value, &CfgPassword); |
andrewboyson | 2:06fa34661f19 | 37 | if (strcmp(name, "ntp ip") == 0) saveString (value, &CfgNtpIp); |
andrewboyson | 2:06fa34661f19 | 38 | if (strcmp(name, "baud") == 0) saveInt (value, &CfgBaud); |
andrewboyson | 2:06fa34661f19 | 39 | } |
andrewboyson | 2:06fa34661f19 | 40 | static void resetValues(void) { |
andrewboyson | 2:06fa34661f19 | 41 | |
andrewboyson | 2:06fa34661f19 | 42 | free(CfgSsid); CfgSsid = NULL; |
andrewboyson | 2:06fa34661f19 | 43 | free(CfgPassword); CfgPassword = NULL; |
andrewboyson | 2:06fa34661f19 | 44 | free(CfgNtpIp); CfgNtpIp = NULL; |
andrewboyson | 2:06fa34661f19 | 45 | CfgBaud = 0; |
andrewboyson | 2:06fa34661f19 | 46 | } |
andrewboyson | 2:06fa34661f19 | 47 | int CfgInit() { |
andrewboyson | 2:06fa34661f19 | 48 | |
andrewboyson | 2:06fa34661f19 | 49 | FILE *fp = fopen(FILE_NAME, "r"); |
andrewboyson | 2:06fa34661f19 | 50 | if (fp == NULL) |
andrewboyson | 2:06fa34661f19 | 51 | { |
andrewboyson | 2:06fa34661f19 | 52 | LogF("Error opening file %s for reading", FILE_NAME); |
andrewboyson | 2:06fa34661f19 | 53 | return -1; |
andrewboyson | 2:06fa34661f19 | 54 | } |
andrewboyson | 2:06fa34661f19 | 55 | resetValues(); |
andrewboyson | 2:06fa34661f19 | 56 | char name[MAX_NAME_OR_VALUE]; |
andrewboyson | 2:06fa34661f19 | 57 | char value[MAX_NAME_OR_VALUE]; |
andrewboyson | 2:06fa34661f19 | 58 | int isName = 1; |
andrewboyson | 2:06fa34661f19 | 59 | int isValue = 0; |
andrewboyson | 2:06fa34661f19 | 60 | int isStart = 0; //Used to trim starts |
andrewboyson | 2:06fa34661f19 | 61 | int n = 0; |
andrewboyson | 2:06fa34661f19 | 62 | int v = 0; |
andrewboyson | 2:06fa34661f19 | 63 | while (1) |
andrewboyson | 2:06fa34661f19 | 64 | { |
andrewboyson | 2:06fa34661f19 | 65 | int c = fgetc(fp); |
andrewboyson | 2:06fa34661f19 | 66 | if (c == '\r') continue; //Ignore windows <CR> characters |
andrewboyson | 2:06fa34661f19 | 67 | if (c == EOF) { handleLine(n, v, name, value); break;} |
andrewboyson | 2:06fa34661f19 | 68 | if (c == '\0') { handleLine(n, v, name, value); break;} |
andrewboyson | 2:06fa34661f19 | 69 | if (c == '\n') { handleLine(n, v, name, value); isName = 1; isValue = 0; isStart = 0; n = 0; v = 0; continue;} |
andrewboyson | 2:06fa34661f19 | 70 | if (c == '=' && isName) { isName = 0; isValue = 1; isStart = 0; continue;} |
andrewboyson | 2:06fa34661f19 | 71 | if (c == '#') { isName = 0; isValue = 0; continue;} |
andrewboyson | 2:06fa34661f19 | 72 | if (c != ' ' && c != '\t') isStart = -1; |
andrewboyson | 2:06fa34661f19 | 73 | if (isName && isStart && n < MAX_NAME_OR_VALUE - 1) name[n++] = (char)c; //n can never exceed MAX_NAME_OR_VALUE - 1 leaving room for a null at length n |
andrewboyson | 2:06fa34661f19 | 74 | if (isValue && isStart && v < MAX_NAME_OR_VALUE - 1) value[v++] = (char)c; //v can never exceed MAX_NAME_OR_VALUE - 1 leaving room for a null at length v |
andrewboyson | 2:06fa34661f19 | 75 | } |
andrewboyson | 2:06fa34661f19 | 76 | |
andrewboyson | 2:06fa34661f19 | 77 | fclose(fp); |
andrewboyson | 2:06fa34661f19 | 78 | |
andrewboyson | 2:06fa34661f19 | 79 | return 0; |
andrewboyson | 2:06fa34661f19 | 80 | } |