Backing up an unused program in case of future need

Dependencies:   mbed

Committer:
andrewboyson
Date:
Thu Dec 06 11:40:19 2018 +0000
Revision:
8:45a0205a298f
Parent:
6:be97d38e0b01
Backing up

Who changed what in which revision?

UserRevisionLine numberNew 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 }