Andrew Boyson
/
iot
Backing up an unused program in case of future need
cfg.cpp@6:be97d38e0b01, 2016-05-31 (annotated)
- Committer:
- andrewboyson
- Date:
- Tue May 31 07:35:28 2016 +0000
- Revision:
- 6:be97d38e0b01
- Parent:
- 2:06fa34661f19
Moved to wait_us for delays below 100us and timer.read_us above. This replaced interrupts which worked but tended to be unreliable.
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 | 6:be97d38e0b01 | 10 | int CfgLogNetwork; |
andrewboyson | 6:be97d38e0b01 | 11 | char CfgTankRom[8]; |
andrewboyson | 6:be97d38e0b01 | 12 | char CfgInletRom[8]; |
andrewboyson | 2:06fa34661f19 | 13 | |
andrewboyson | 2:06fa34661f19 | 14 | static void saveString(char *value, char **dest) { |
andrewboyson | 2:06fa34661f19 | 15 | *dest = (char*)realloc(*dest, strlen(value) + 1); //strlen does not include the null so add 1 |
andrewboyson | 2:06fa34661f19 | 16 | if (*dest == NULL) |
andrewboyson | 2:06fa34661f19 | 17 | { |
andrewboyson | 2:06fa34661f19 | 18 | LogCrLf("Error reallocating memory in saveString"); |
andrewboyson | 2:06fa34661f19 | 19 | return; |
andrewboyson | 2:06fa34661f19 | 20 | } |
andrewboyson | 2:06fa34661f19 | 21 | *dest = strcpy(*dest, value); |
andrewboyson | 2:06fa34661f19 | 22 | } |
andrewboyson | 2:06fa34661f19 | 23 | static void saveInt (char *value, int *dest) { |
andrewboyson | 2:06fa34661f19 | 24 | *dest = atoi(value); |
andrewboyson | 2:06fa34661f19 | 25 | } |
andrewboyson | 6:be97d38e0b01 | 26 | static void saveRom (char *value, char* dest) { |
andrewboyson | 6:be97d38e0b01 | 27 | char* p = value; |
andrewboyson | 6:be97d38e0b01 | 28 | for (int i = 0; i < 8; i++) dest[i] = (char)strtoul(p, &p, 16); |
andrewboyson | 6:be97d38e0b01 | 29 | } |
andrewboyson | 2:06fa34661f19 | 30 | static void rtrim (int i, char *s) { //i is the length of the thing to trim |
andrewboyson | 2:06fa34661f19 | 31 | while(1) |
andrewboyson | 2:06fa34661f19 | 32 | { |
andrewboyson | 2:06fa34661f19 | 33 | s[i] = '\0'; |
andrewboyson | 2:06fa34661f19 | 34 | if (--i < 0) break; |
andrewboyson | 2:06fa34661f19 | 35 | if (s[i] != ' ' && s[i] != '\t') break; |
andrewboyson | 2:06fa34661f19 | 36 | } |
andrewboyson | 2:06fa34661f19 | 37 | } |
andrewboyson | 2:06fa34661f19 | 38 | |
andrewboyson | 2:06fa34661f19 | 39 | static void handleLine(int n, int v, char *name, char *value) { |
andrewboyson | 2:06fa34661f19 | 40 | rtrim(n, name); |
andrewboyson | 2:06fa34661f19 | 41 | rtrim(v, value); |
andrewboyson | 6:be97d38e0b01 | 42 | if (strcmp(name, "ssid") == 0) saveString(value, &CfgSsid); |
andrewboyson | 6:be97d38e0b01 | 43 | if (strcmp(name, "password") == 0) saveString(value, &CfgPassword); |
andrewboyson | 6:be97d38e0b01 | 44 | if (strcmp(name, "ntp ip") == 0) saveString(value, &CfgNtpIp); |
andrewboyson | 6:be97d38e0b01 | 45 | if (strcmp(name, "baud") == 0) saveInt (value, &CfgBaud); |
andrewboyson | 6:be97d38e0b01 | 46 | if (strcmp(name, "log network") == 0) saveInt (value, &CfgLogNetwork); |
andrewboyson | 6:be97d38e0b01 | 47 | if (strcmp(name, "tank") == 0) saveRom (value, CfgTankRom); |
andrewboyson | 6:be97d38e0b01 | 48 | if (strcmp(name, "inlet") == 0) saveRom (value, CfgInletRom); |
andrewboyson | 2:06fa34661f19 | 49 | } |
andrewboyson | 2:06fa34661f19 | 50 | static void resetValues(void) { |
andrewboyson | 2:06fa34661f19 | 51 | |
andrewboyson | 6:be97d38e0b01 | 52 | free(CfgSsid); CfgSsid = NULL; |
andrewboyson | 6:be97d38e0b01 | 53 | free(CfgPassword); CfgPassword = NULL; |
andrewboyson | 6:be97d38e0b01 | 54 | free(CfgNtpIp); CfgNtpIp = NULL; |
andrewboyson | 6:be97d38e0b01 | 55 | CfgBaud = 0; |
andrewboyson | 6:be97d38e0b01 | 56 | CfgLogNetwork = 0; |
andrewboyson | 6:be97d38e0b01 | 57 | memset(CfgTankRom, 0, 8); |
andrewboyson | 6:be97d38e0b01 | 58 | memset(CfgInletRom, 0, 8); |
andrewboyson | 2:06fa34661f19 | 59 | } |
andrewboyson | 2:06fa34661f19 | 60 | int CfgInit() { |
andrewboyson | 2:06fa34661f19 | 61 | |
andrewboyson | 2:06fa34661f19 | 62 | FILE *fp = fopen(FILE_NAME, "r"); |
andrewboyson | 2:06fa34661f19 | 63 | if (fp == NULL) |
andrewboyson | 2:06fa34661f19 | 64 | { |
andrewboyson | 2:06fa34661f19 | 65 | LogF("Error opening file %s for reading", FILE_NAME); |
andrewboyson | 2:06fa34661f19 | 66 | return -1; |
andrewboyson | 2:06fa34661f19 | 67 | } |
andrewboyson | 2:06fa34661f19 | 68 | resetValues(); |
andrewboyson | 2:06fa34661f19 | 69 | char name[MAX_NAME_OR_VALUE]; |
andrewboyson | 2:06fa34661f19 | 70 | char value[MAX_NAME_OR_VALUE]; |
andrewboyson | 2:06fa34661f19 | 71 | int isName = 1; |
andrewboyson | 2:06fa34661f19 | 72 | int isValue = 0; |
andrewboyson | 2:06fa34661f19 | 73 | int isStart = 0; //Used to trim starts |
andrewboyson | 2:06fa34661f19 | 74 | int n = 0; |
andrewboyson | 2:06fa34661f19 | 75 | int v = 0; |
andrewboyson | 2:06fa34661f19 | 76 | while (1) |
andrewboyson | 2:06fa34661f19 | 77 | { |
andrewboyson | 2:06fa34661f19 | 78 | int c = fgetc(fp); |
andrewboyson | 2:06fa34661f19 | 79 | if (c == '\r') continue; //Ignore windows <CR> characters |
andrewboyson | 2:06fa34661f19 | 80 | if (c == EOF) { handleLine(n, v, name, value); break;} |
andrewboyson | 2:06fa34661f19 | 81 | if (c == '\0') { handleLine(n, v, name, value); break;} |
andrewboyson | 2:06fa34661f19 | 82 | if (c == '\n') { handleLine(n, v, name, value); isName = 1; isValue = 0; isStart = 0; n = 0; v = 0; continue;} |
andrewboyson | 2:06fa34661f19 | 83 | if (c == '=' && isName) { isName = 0; isValue = 1; isStart = 0; continue;} |
andrewboyson | 2:06fa34661f19 | 84 | if (c == '#') { isName = 0; isValue = 0; continue;} |
andrewboyson | 2:06fa34661f19 | 85 | if (c != ' ' && c != '\t') isStart = -1; |
andrewboyson | 2:06fa34661f19 | 86 | 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 | 87 | 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 | 88 | } |
andrewboyson | 2:06fa34661f19 | 89 | |
andrewboyson | 2:06fa34661f19 | 90 | fclose(fp); |
andrewboyson | 2:06fa34661f19 | 91 | |
andrewboyson | 2:06fa34661f19 | 92 | return 0; |
andrewboyson | 2:06fa34661f19 | 93 | } |